PHPでクラス内からstaticメソッドを呼ぶ方法として
self::foo();
のようにselfを使うことができますが、継承が絡むとselfは思い通り動いてくれないことがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php abstract class Base { abstract protected static function foo(); public static function bar() { self::foo(); } } class Sub extends Base { protected static function foo() { echo "Sub foo\n"; } } Sub::bar(); |
このようにabstract staticメソッドfoo()を呼び出すことだけを決めたメソッドbar()を抽象親クラスで定義し、サブクラスでこのfoo()をオーバーライドすることでbar()が動くように実装すると
Fatal error: Uncaught Error: Cannot call abstract method Base::foo() in /**/abstract_static.php:7
というエラーが出ます。Base内で使われたselfはbar()が定義されたBaseを参照しており、自動的にサブクラスのfoo()を参照することはできません。
static::
これを解決してくれるのがstatic::です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php abstract class Base { abstract protected static function foo(); public static function bar() { static::foo(); // ←ここを変える } } class Sub extends Base { protected static function foo() { echo "Sub foo\n"; } } Sub::bar(); |
static::は呼び出した際のクラスを参照するようになっているので、これでちゃんと
Sub foo
と出力されます。