[PHP] 遅延静的束縛

2018年5月21日月曜日

PHP

Pythonでは

[Python] classメソッドとstaticメソッドでは、Pythonでのclassメソッドとstaticメソッドを見た。

同じようなことがPHPでもできないだろうか。

PHPでは

PHPでは、遅延静的束縛なんていう仰々しい名前の機能で、これに近いことができる。

http://php.net/manual/ja/language.oop5.late-static-bindings.php

Pythonの場合はメソッド自体をclassメソッドにしたり、staticメソッドにしたりしたけど、PHPでは静的コンテキストでクラスを参照する時にself::とstatic::を使い分ける。

class.php
<?php
class BaseClass {

  private static $var = 'base';

  public static function selfMethod() {
    echo self::$var . "\n";
  }
 
  public static function staticMethod() {
    echo static::$var . "\n";
  }
}

class SubClass extends BaseClass {
  private static $var = 'sub';
}

BaseClass::selfMethod();
BaseClass::staticMethod();
SubClass::selfMethod();
SubClass::staticMethod();

これで、うまくいきそうだけど、エラーになってしまった。

$ php class.php
base
base
base

Fatal error: Uncaught Error: Cannot access private property SubClass::$var in class.php:11

private変数は見えない

とりあえず、SubClassの$varをprotectedにすれば、staticMethodからも見えるようになる。

class.php
<?php
...

class SubClass extends BaseClass {
  protected static $var = 'sub';
}

BaseClass::selfMethod();
BaseClass::staticMethod();
SubClass::selfMethod();
SubClass::staticMethod();
$ php class.php
base
base
base
sub

仕組みがメソッドのオーバーライドとは異なるし、privateだから、異なるクラスからは見えないというのはわかるけど、なんだかなという感じ。
残念ながら、staticの意味がPythonとは逆になってしまっているけど、これは仕方ないとこか。