Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Наследование методов и их переопределение
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Наследование методов и их переопределение

Страниц (1): [1]
 

1. Opo6ac - 17 Августа, 2011 - 09:32:12 - перейти к сообщению
Добрый день.
Помогите разобраться с наследованием и переопределением методов в дочернем классе.

Итак, есть "корневой" класс system. Есть класс afisha, который extends system. И есть класс afisha_cities, который extends afisha.

В "корневом" классе описывается геттер:
PHP:
скопировать код в буфер обмена
  1.   function &__get($name){
  2.     if(property_exists(__CLASS__,$name)){
  3.       return $this->$name;
  4.     } else {
  5.       switch($name){
  6.         case 'users':
  7.           $this->users = $this->read_data('system.users');
  8.           return $this->users;
  9.           break;
  10. ... другие кейсы опустил...

Примечание: существует ряд свойств, которые могут подгружаться различными методами по требованию - для того и нужен геттер, чтобы не лепить множество проверок на существование свойства.

В классе afisha этот геттер переопределяется:
PHP:
скопировать код в буфер обмена
  1.   function &__get($name){
  2.     parent::__get($name);
  3.     switch($name){
  4.       case 'cities':
  5.         $this->cities = $this->get_cities();
  6.         return $this->cities;
  7.       break;
  8.     }
  9.   }

Примечание: в дочернем классе появляются свои свойства, которые нужно подгружать по первому требованию. Но при этом не нужно забывать про старые свойства из system. Именно для этого переопределяя в дочернем классе геттер, я упоминаю родительский геттер и только потом добавляю еще кейсов для автозагрузки.
Примечание: родительский геттер "не закрывается", то есть он или return значение при наличии соответствующего кейса, или ничего не возвращает. Default кейса нет.

Проблема в том, что в экземпляре "третьего поколения" (в afisha_cities, который extends afisha. В нем геттер никак не перегружается, а всего лишь наследуется по умолчанию) не запускаются геттеры из system. Вернее, они запускаются.. но как-то очень странно срабатывают.

если я спрошу:
var_export( $this->user );
то вернется NULL

Но если спросить в такой последовательности:
$this->user;
var_export( $this->user );
то вернется требуемое значение

В общем, помогите понять, где собака зарыта.


Дополнение: геттер однозначно рабочий, он проверялся на другом потомке (как бы второго поколения) system с тем отличием, что в потомке никакой перегрузки геттера не было. Он просто наследовался как обычно и срабатывал, как ожидается.
2. Opo6ac - 17 Августа, 2011 - 16:31:38 - перейти к сообщению
Модификацию наследуемого метода в данном случае осуществил так:
PHP:
скопировать код в буфер обмена
  1.   function &__get($name){
  2.     if(parent::__get($name)) return parent::__get($name);
  3.  
  4.     switch($name){
  5.  
  6.       case 'afisha_config':
  7.         return $this->cities;
  8.       break;
  9.     }
  10.   }


Благодарю за внимание.
LEVEL UP! Радость
3. LIME - 17 Августа, 2011 - 17:01:50 - перейти к сообщению
а если так?
PHP:
скопировать код в буфер обмена
  1. function &__get($name){
  2.         switch($name){
  3.       case 'cities':
  4.         $this->cities = $this->get_cities();
  5.         return $this->cities;
  6.       break;
  7.     return parent::__get($name);
  8.     }
  9.   }
4. Opo6ac - 17 Августа, 2011 - 17:44:21 - перейти к сообщению
LIME, да, можно, в принципе, и так. Тогда и родительский switch можно будет "закрыть" default кейсом, который будет возвращать false - удобно будет для проверки на существование свойства (чтобы isset() не трогать)

Спасибо за свежую мысль) - плюсик поставить не могу, статус не позволяет.

О!... ничего не понял, но сделав предложенную замену, исправил баг, который уже отчаялся сегодня пофиксить. Двойное спасибо!)

 

Powered by ExBB FM 1.0 RC1