3

PHP で遅延静的バインディングをコーディングして使用しているときに、奇妙な動作を見つけました。static()親クラスで作成された子オブジェクトは、親のプライベート メソッドにアクセスできます。

次に例を示します。

class Attachment
{
  public static function createFromFile($file)
  {
    $attachment = new static();
    echo get_class($attachment) . PHP_EOL;
    $attachment->loadFromFile($file);
  }

  private function loadFromFile($file)
  {
    echo 'attachment';
  }
}

class PictureAttachment extends Attachment
{
  //...
}

PictureAttachment::createFromFile('example.txt');

出力:

PictureAttachment
attachment

これは正しい動作ですか?

4

1 に答える 1

6

はい、これは正しいです。プライベート メソッドを呼び出しているクラスは、それを宣言しているクラスと同じです。子クラスをインスタンス化するかどうかは問題ではありません。親のプライベート メソッドを呼び出す子クラスにコードを含めることはできません。

言い換えると:

class Foo {

    protected function bar() {
        $this->baz();
    }

    private function baz() { }

}

class Bar extends Foo {

    protected function bar() {
        parent::bar();   // <-- works
        parent::baz();   // <-- doesn't work
    }

}
于 2013-03-28T07:58:25.593 に答える