在 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
- 完全独立于 Base
的 privateVariable
.
那不是我的本意。相反,这是我降低 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'");
}
在检查我的一个项目的 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
- 完全独立于 Base
的 privateVariable
.
那不是我的本意。相反,这是我降低 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'");
}