PHPの遅延静的束縛のメモ
遅延束縛とは...
静的継承のコンテキストで呼び出し元のクラスを参照できるようになります。
https://www.php.net/manual/ja/language.oop5.late-static-bindings.php
よくわからないので試しにやってみると...
以下のように子クラスで親クラスの静的メソッドをオーバーライドしますが、 親クラスのメソッドが実行されます。
<?php class ParentClass { public function sayHello() { self::hello(); } public static function hello() { echo __CLASS__. ' hello!'; } } class ChildClass extends ParentClass { // 親クラスの静的メソッドをオーバーライド public static function hello() { echo __CLASS__. ' hello!!'; } } $hello = new ChildClass(); $hello->sayHello(); //ParentClass hello! ?>
なぜらならself
は「自クラスのプロパティ、及びメソッドへの静的アクセス」なので定義してあるクラスがスコープになります。
そこで以下のようにself
をstatic
にするとオーバーライドした子クラスのメソッドが呼ばれるようになります。
<?php class ParentClass { public function sayHello() { static::hello(); } public static function hello() { echo __CLASS__. ' hello!'; } } class ChildClass extends ParentClass { public static function hello() { echo __CLASS__. ' hello!!'; } } $hello = new ChildClass(); $hello->sayHello(); //ChildClass hello! ?>