В производных классах в PHP почему не является ошибкой присваивать закрытые переменные, объявленные в базовом классе?

Проходя по 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 значение, которое поймает это?

Или есть какой-то другой автоматизированный способ, которым я могу это поймать?

2

Решение

Это не ошибка в PHP. Это называется перегрузка имущества и совершенно правильно.

Если вы хотите предотвратить это, вы можете использовать __set() Волшебный метод для перехвата, когда вы присваиваете значение необъявленному свойству и выдает ошибку при этом:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]