Переопределение переменных PHP - PullRequest
21 голосов
/ 14 июня 2011

Когда я пытаюсь переопределить переменную класса так же, как переопределить метод класса в PHP.Например:

class DataMapper {
     protected $_name = null;

     public function printName() {
          echo $this->_name;
     }
}

class Model extends DataMapper {
     protected $_name = 'Ana';
}

$test = new Model();
$test->printName();

Это печать 'Ана'.

Почему PHP может делать такие вещи?Это нарушает закон объектно-ориентированной парадигмы

Ответы [ 3 ]

25 голосов
/ 14 июня 2011

Это не так.Вот как должен работать PHP.Взгляните на Классы PHP и видимость объектов .

Объекты одного типа будут иметь доступ друг к другу как к закрытым, так и к защищенным элементам, даже если они не совпадают с экземплярами.Это связано с тем, что конкретные детали реализации уже известны, когда они находятся внутри этих объектов.

Поскольку модель расширяет DataMapper, она имеет доступ к своим функциям, переменным и тому подобному, но она может переопределить их, что и произошло.Хотя ваша функция находится в классе DataMapper, она вызывается (и наследуется) от класса Model, в котором имя установлено на Ana.

4 голосов
/ 14 июня 2011

Я думаю, у вас просто проблемы с пониманием того, что это делает. Когда вы ссылаетесь на $ this, это фактически ссылка на текущий объект.

Когда вы наследуете класс DataMapper, метод printName () становится доступным внутри объектов Model, но ссылка $ this по-прежнему ссылается на текущий объект Model, $ test.

Поскольку свойство $ _name объектов Model инстанцируется в «Ana», оно печатает Ana. Это именно то, что ожидается. Возможно, еще одно прочтение теорий Наследования и Сфера поможет вам понять, что здесь происходит.

3 голосов
/ 14 июня 2011

Я не думаю, что это нарушает "закон ОО". Вы унаследовали класс DataMapper. И, таким образом, вы унаследовали публичную функцию printName (). Поэтому, когда вы вызываете функцию, она действует как функция, которая принадлежит классу модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...