在 PHP 中的派生 classes 中,为什么分配给基 class 上声明的私有变量不是错误?

In derived classes in PHP, why isn't it an error to assign to private variables declared on the base class?

在检查我的一个项目的 PHP 代码时,我注意到一些东西 - 我认为 - 根本不应该工作。然而,它不会在 PHP 5.2.17 或 5.6.14.

中导致任何错误或通知
class Base {

    private $privateVariable;

    public function __construct() {
    }
}

class Derived extends Base {

  public function __construct() {

    parent::__construct();

    $this->privateVariable = 'Setting a private variable in the base class.';
  }
}

$derived = new Derived();

怎么会这样?为什么 PHP 允许 Derived 分配给 Base 中定义的私有变量?

好吧,事实证明,不是Derived 中对 $this->privateVariable 的赋值正在创建一个 全新的 [= Derived 上的 40=] 成员变量称为 privateVariable - 完全独立于 BaseprivateVariable.

那不是我的本意。相反,这是我降低 Base->privateVariable 的可见性时引入的错误,但没有发现派生的 类 试图引用它。

为什么这不是错误? PHP 规范是否明确允许这样做?

是否有一个 error_reporting 值可以捕获这个?

或者有其他一些自动化的方法可以捕捉到这个吗?

这不是 PHP 中的错误。它叫做 property overloading 并且完全有效。

如果你想防止这种情况发生,你可以使用 __set() 魔术方法来捕获你为未声明的 属性 赋值并在你这样做时抛出错误:

public function __set($name, $value) {
    throw new \Exception("'$name' does not exist and cannot be assigned the value '$value'");
}