Подтвердить что ты не робот

Переопределение переменных 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 может так поступить? Это нарушает закон объектно-ориентированной парадигмы

4b9b3361

Ответ 1

Это не так. Это то, как PHP должен работать. Посмотрите Видимость классов и объектов PHP.

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

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

Ответ 2

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

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

Так как свойство $_name объектов Model создается экземпляром "Ana", оно печатает Ana. Это именно то, что ожидается. Возможно, еще раз прочитав теории "Наследие" и "Сфера", вы сможете понять, что происходит здесь.

Ответ 3

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