在尝试调试一些 PHP 类时,我遇到了一些在我看来非常奇怪的行为。
我已经构建了以下行为的演示:
class BaseClass {
public function baseMethod () {
echo (implode (' ', $this -> childMethod ()) . PHP_EOL);
}
}
class ChildClass extends BaseClass {
protected function childMethod () {
return array ('What', 'The', 'Actual', 'Fork!');
}
}
$a = new ChildClass ();
$a -> baseMethod ();
现在,在我看来,基类根本不应该对子类做出任何假设,除了它通过声明(或继承)抽象方法或通过实现接口为子类强制执行的假设。但是,上面的代码实际上输出了一个字符串,并没有抛出任何错误!
什么是真正的分叉!
这对我来说似乎是一种破碎的行为。除非基类声明abstract protected function childMethod();
,否则它应该不能调用它,不是吗?
我一直在网上搜索,试图找到一些可以证明这是预期行为的东西。到目前为止,我设法从PHP 手册中找到以下内容:
其他对象的可见性
相同类型的对象将可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为在这些对象内部时已经知道实现特定的细节
那么我在这里目睹的行为是正确的还是 PHP 中的错误?这当然不是我要依赖的行为,因为这对我来说似乎是错误的。
仅供参考,我们在实际代码中发现的问题是子类声明了超类试图调用的私有方法。超类没有声明方法抽象(如果这样做了,它至少必须受到保护)。