のぐそんブログ

暗いおじさんがシコシコ書くブログです。

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「自クラスのプロパティ、及びメソッドへの静的アクセス」なので定義してあるクラスがスコープになります。

そこで以下のようにselfstaticにするとオーバーライドした子クラスのメソッドが呼ばれるようになります。

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

?>