パーフェクトPHP 5.3.2 遅延的束縛がわからない仲間へ

パーフェクトphpを学習していて、遅延静的束縛で少し困惑したので、自分なりにわかりやすくまとめておきます。

多分、遅延静的束縛で混乱するところはselfとstaticの違いだと思います。 なんでselfからstaticに変えたら親クラスではなく子クラスのメソッドを呼び出せるのか。

まず、前提として理解しておきたいのは
・selfは定義時のクラスを示す
・staticは実行時のクラスを示す

この2点です。

では実際にコードで確認してみます。

<?php
    class Father {
        public function family() {
            self::member();
        }

        public static function member() {
            echo '私は父です', PHP_EOL;
        }
    }

    class Son extends Father {
        public static function member()
        {
            echo '私は息子です', PHP_EOL;
        }
    }

    $son = new Son();
    $son->family();

このコードは、Fatherクラスを継承したSonクラスのインスタンスを作り、自己紹介をしてもらうプログラムです。 Sonクラスのインスタンスを生成したので期待する結果は「私は息子です」なのですが、実行すると「私は父です」になってしまいます。

原因は「selfは実行時のクラスを示す」からです。 つまり、self::member();は実際には

Father::member();

となっていて親であるFatherクラスのmemberメソッドを参照してしまっているわけです。

これを解決するために self::memberの部分を

static::member();

に変更すれば、staticは実行時のクラスを示すので

Son::member();

という動きになり、期待していた出力結果の「私は息子です」になります。

これでインスタンスごとに特有の処理ができるので拡張性が高くなりますね! 以上が遅延静的束縛です。



ここまで読んでいただきありがとうございます。間違い等がありましたらご指摘いただければ幸いです。