Добрый день.
Помогите разобраться с наследованием и переопределением методов в дочернем классе.
Итак, есть "корневой" класс system. Есть класс afisha, который extends system. И есть класс afisha_cities, который extends afisha.
В "корневом" классе описывается геттер:
PHP:
скопировать код в буфер обмена
function &__get($name){
if(property_exists(__CLASS__,$name)){
return $this->$name;
} else {
switch($name){
case 'users':
$this->users = $this->read_data('system.users');
return $this->users;
break;
... другие кейсы опустил...
Примечание: существует ряд свойств, которые могут подгружаться различными методами по требованию - для того и нужен геттер, чтобы не лепить множество проверок на существование свойства.
В классе afisha этот геттер переопределяется:
PHP:
скопировать код в буфер обмена
function &__get($name){
parent::__get($name);
switch($name){
case 'cities':
$this->cities = $this->get_cities();
return $this->cities;
break;
}
}
Примечание: в дочернем классе появляются свои свойства, которые нужно подгружать по первому требованию. Но при этом не нужно забывать про старые свойства из system. Именно для этого переопределяя в дочернем классе геттер, я упоминаю родительский геттер и только потом добавляю еще кейсов для автозагрузки.
Примечание: родительский геттер "не закрывается", то есть он или return значение при наличии соответствующего кейса, или ничего не возвращает. Default кейса нет.
Проблема в том, что в экземпляре "третьего поколения" (в afisha_cities, который extends afisha. В нем геттер никак не перегружается, а всего лишь наследуется по умолчанию) не запускаются геттеры из system. Вернее, они запускаются.. но как-то очень странно срабатывают.
если я спрошу:
var_export( $this->user );
то вернется NULL
Но если спросить в такой последовательности:
$this->user;
var_export( $this->user );
то вернется требуемое значение
В общем, помогите понять, где собака зарыта.
Дополнение: геттер однозначно рабочий, он проверялся на другом потомке (как бы второго поколения) system с тем отличием, что в потомке никакой перегрузки геттера не было. Он просто наследовался как обычно и срабатывал, как ожидается.