2010年7月28日水曜日

PHPのスコープ演算子 self:: と static::

class A {
    static function getInstance() {
    }

    protected function A2B() {
        echo "A";
    }

    public function _test() {
        self::A2B();
    }
}
class B extends A {
    public function A2B() {
        echo "B";
    }

    public function test() {
        self::A2B();
    }

    public function test2() {
        self::_test();
    }
}
さて、こういうクラスがあったとしましょう。
A::test();
A::test2();
この結果はどうなるでしょうか?
結果は
B
A
となるはず(試してません)です。
クラスの中で self:: というスコープ定義を使用した場合、あくまでも「自分」を参照します。ですから継承先(B)から関数を呼び出しても、その関数が継承元(A)の関数であれば、self:: は A:: と等価です。
では、継承元(A)から継承先(B)を参照したい場合はどうすればよいのでしょうか?
最近、テーブルクラスの汎用化を行う際に梃子摺った問題で、いまだに解決できていません。
phpのバージョンが 5.3以上であれば、self:: のかわりに static:: を使うことで、呼び出し元のクラスを参照することができるようです。

クラス関数を静的(static)な実装にしてしまっているので、コンストラクタで呼び出し先のクラス名を渡す、などの操作もできず。
困りました。


コアインスタンスだけは動的に生成するようにしようか・・・

0 件のコメント:

コメントを投稿