PHP后期静态绑定无法正常工作

时间:2013-03-28 07:54:46

标签: php late-static-binding static-binding

在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

这是正确的行为吗?

1 个答案:

答案 0 :(得分: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
    }

}