PHP: クラス
September 24, 2020
基本形 #
<?php
class MyClass
{
public $name = "john";
public function say() {
echo "hello " . $this->name . "\n";
}
}
$instance = new MyClass();
$instance->say(); //=> hello john
- インスタンスのプロパティおよびメソッドにアクセスするには
->
演算子を使う - そのクラスの static なプロパティおよびメソッドにアクセスするには
::
演算子を使う - メソッド内で自身のインスタンスにアクセスするには
$this
変数を参照する
コンストラクタ #
__construct()
がコンストラクタとなる。
<?php
class MyClass
{
public $name;
public function __construct($name) {
$this->name = $name;
}
public function say() {
echo "hello " . $this->name . "\n";
}
}
$instance1 = new MyClass("john");
$instance1->say(); //=> hello john
$instance2 = new MyClass("betty");
$instance2->say(); //=> hello betty
callable なプロパティの関数実行方法 #
$obj->prop
と $obj->method()
はプロパティとメソッドでシンボルテーブルが別、かつ ()
の有無で参照するシンボルテーブルが分かれるため、 callable なプロパティをそのまま関数実行しようとして $obj->prop()
と記述すると問題がある。
($obj->prop)()
と括弧で括ると正しく実行できる。
継承 (extends) #
extends
キーワードで継承。
<?php
class SuperClass
{
public $name;
public function method() {
echo "super " . $this->name . "\n";
}
}
class SubClass extends SuperClass
{
public function method() {
parent::method();
echo "sub " . $this->name . "\n";
}
}
$obj = new SubClass();
$obj->name = "john";
$obj->method();
super john
sub john
オーバーライドしたメソッド内で親クラスのメソッドを呼び出すには parent::method()
と書ける。
可視性 #
public
protected
private
Javaと同じっぽい。
プロパティの型定義 #
関数の型定義同様可能。ただし PHP 7.4.0 から。
NULL を許容するには public ?type $name
のように ?
を付与する。
関数の型定義と異なる点で self
parent
が指定でき、自身のクラス型および親クラスの型を指定できる。
クラス定数 #
const
キーワードで定義可能で、static 同様 ::
演算子でアクセスできる。
<?php
class MyClass
{
const VAL = "hello";
}
echo MyClass::VAL; //=> hello
インターフェース #
特定のIN/OUT型を持った実装の強制。実装の詳細はインターフェースには持たない。Javaと同じ。
トレイト #
継承では都合の悪いクラス横断的な実装を共有する場合に使う。インターフェースとの違いは実装の詳細を持つこと。 Ruby でいうところの module 。
無名クラス #
無名関数同様、名前の持たないクラス。引数に直接指定するなどで利用できる。
<?php
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
use SomeTrait;
});
object(class@anonymous)#1 (1) {
["num":"class@anonymous":private]=>
int(10)
}
オーバーロード #
動的にプロパティやメソッドを生やす方法。存在しないもしくはprivateで不可視なプロパティやメソッドへアクセスした際に呼び出されるフックメソッドのようなもの。
public __set ( string $name , mixed $value ) : void
public __get ( string $name ) : mixed
public __isset ( string $name ) : bool
public __unset ( string $name ) : void
public __call ( string $name , array $arguments ) : mixed
public static __callStatic ( string $name , array $arguments ) : mixed