Переопределение переменных PHP
Когда я пытаюсь переопределить переменную класса так же, как переопределить метод класса в PHP. Как:
class DataMapper {
protected $_name = null;
public function printName() {
echo $this->_name;
}
}
class Model extends DataMapper {
protected $_name = 'Ana';
}
$test = new Model();
$test->printName();
Он печатает 'Ana'.
Почему PHP может так поступить? Это нарушает закон объектно-ориентированной парадигмы
Ответы
Ответ 1
Это не так. Это то, как PHP должен работать. Посмотрите Видимость классов и объектов PHP.
Объекты одного и того же типа будут иметь доступ к каждому другому частному и защищенному членам, даже если это не те же экземпляры. Это связано с тем, что конкретные детали реализации уже известны, когда внутри этих объектов.
Поскольку модель расширяет DataMapper, у нее есть доступ к ее функциям, переменным и тому подобному, но она может переопределить их, что и произошло. Хотя ваша функция живет в классе DataMapper, она вызывала из (и унаследовала) класс Model, в котором имя установлено в Ana.
Ответ 2
Я думаю, что вам просто сложно понять, что это такое. Когда вы ссылаетесь на $this, это фактически ссылается на текущий объект.
Когда вы наследуете класс DataMapper, метод printName() становится доступным внутри объектов Model, но $this reference по-прежнему относится к текущему объекту Model, $test.
Так как свойство $_name объектов Model создается экземпляром "Ana", оно печатает Ana. Это именно то, что ожидается. Возможно, еще раз прочитав теории "Наследие" и "Сфера", вы сможете понять, что происходит здесь.
Ответ 3
Я не думаю, что это нарушает "закон ОО". Вы унаследовали класс DataMapper. И таким образом вы унаследовали публичную функцию printName(). Поэтому, когда вы вызываете функцию, она действует как функция, принадлежащая классу модели.