🐘

staticメソッド内でサブクラス自身を表す際にはselfではなくstatic

2020/09/25に公開

ははーっと感心したのでメモ。

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());   // A
echo get_class(B::get_static()); // B
echo get_class(A::get_static()); // A

スーパークラスの static メソッド内で「呼び出す際に指定したクラス」を表現したかったのですが、self だと「スーパークラス自身」が返ってきてしまい、あんたじゃないよって事になりました。

new staticとするとA::get_static()なら A が返り、B::get_static()ならちゃんと B が返ってきます。new staticという記法は初めて知りました。PHP 5.3 からだそうで。

Discussion