[PHP]オーバーライドでの呼び出したメソッドはだれのか?

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が効きます

遅延静的束縛を忘れかけてました..

カテゴリーphp

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください