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とは逆になってしまっているけど、これは仕方ないとこか。
0 件のコメント:
コメントを投稿