4

LSB機能に関するphpマニュアルを読んでいて、静的コンテキストでどのように機能するかは理解していますが、非静的コンテキストでは完全には理解していません。マニュアルの例は次のとおりです。

<?php
class A {
    private function foo() {
        echo "success!\n";
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}

$b = new B();
$b->test();
$c = new C();
$c->test();   //fails
?>

出力は次のとおりです。

success!
success!
success!


Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

クラスBについてはわかりませんが、AのプライベートメソッドをBに継承するにはどうすればよいですか?誰かがここで何が起こっているのかを私に教えてもらえますか?どうもありがとう!

4

1 に答える 1

3

遅延静的バインディングの使用は、呼び出しに選択されるメソッドのみを変更します。メソッドが選択されると、呼び出し可能かどうかを決定するために可視性ルールが適用されます。

の場合BA::testを検索して呼び出しますA::foo。のコメントBが正しくfooありません。 にコピーされていませんBAプライベートなので、などの他のメソッドからのみ呼び出すことができA::testます。

C遅延静的バインディング メカニズムが新しいプライベート メソッドC::fooを見つけたが、Aのメソッドがそれにアクセスできないため、失敗します。

混乱を避けるために、静的フィールドとメソッドの遅延静的バインディングを予約することをお勧めします。

于 2012-04-08T05:07:16.553 に答える