在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
这是正确的行为吗?
答案 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
}
}