PHPでのオーバーライドでの親子メソッド呼び出しで
混乱したので整理。
まず、普通のoverride
class A {
public function who() {
echo 'Aです';
}
public function test() {
$this->who();
}
}
class B extends A {
public function who() {
echo 'Bです';
}
public function test() {
$this->who();
}
}
$cls = new B();
$cls->test();
// [実行結果]
// Bです
まだ、Aのメソッドは一つも呼び出されていません。
test()を親クラスのtest()に変えてみると
class A {
public function who() {
echo 'Aです';
}
public function test() {
$this->who();
}
}
class B extends A {
public function who() {
echo 'Bです';
}
public function test() {
parent::test();
}
}
$cls = new B();
$cls->who();
// [実行結果]
// Bです
これもBのwho()が呼び出されます
クラスBから、Aのwho()が呼びたいなら
class A {
public function who() {
echo 'Aです';
}
public function test() {
$this->who();
}
}
class B extends A {
public function who() {
parent::who();
//echo 'Bです';
}
public function test() {
parent::test();
}
}
$cls = new B();
$cls->who();
// [実行結果]
// Aです
これで、親クラスのwhoメソッドが呼ばれます
そして、staticの場合
class A {
public static function who() {
echo 'Aです';
}
public static function test() {
self::who();
}
}
class B extends A {
public static function who() {
echo 'Bです';
}
public static function test() {
parent::test();
}
}
// [実行結果]
// Aです
BからAのtestを呼ぶ、self::who()はAのwho()となります
overrideしたBのwho()としたいなら
遅延静的束縛 (Late Static Bindings)ってのですね
(PHP5.3以降じゃないと効かないです)
class A {
public static function who() {
echo 'Aです';
}
public static function test() {
static::who();
}
}
class B extends A {
public static function who() {
echo 'Bです';
}
public static function test() {
parent::test();
}
}
// [実行結果]
// Bです
self::でなくてstatic::にしてやると
overrideが効きます
遅延静的束縛を忘れかけてました..