PHPでクラス内からstaticメソッドを呼ぶ方法として
self::foo();
のようにselfを使うことができますが、継承が絡むとselfは思い通り動いてくれないことがあります。
<?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::です。
<?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
と出力されます。
コメント