Проходя по 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
?
Ну, получается, это не: назначение $this->privateVariable
в Derived
создает совершенно новый переменная-член на Derived
называется privateVariable
— который полностью независим от Base
«s privateVariable
,
Это не было моим намерением. Скорее, это была ошибка, представленная, когда я опустил Base->privateVariable
видимость, и не уловил, что производные классы пытаются ссылаться на него.
Почему это не ошибка? Спецификация PHP явно позволяет это?
Есть error_reporting
значение, которое поймает это?
Или есть какой-то другой автоматизированный способ, которым я могу это поймать?
Это не ошибка в PHP. Это называется перегрузка имущества и совершенно правильно.
Если вы хотите предотвратить это, вы можете использовать __set()
Волшебный метод для перехвата, когда вы присваиваете значение необъявленному свойству и выдает ошибку при этом:
public function __set($name, $value) {
throw new \Exception("'$name' does not exist and cannot be assigned the value '$value'");
}
Других решений пока нет …