PHP: クラス

PHP: クラス

September 24, 2020
PHP
PHP

基本形 #

<?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