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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: parent::parent:: метода

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Tek
Отправлено: 04 Декабря, 2013 - 07:15:50
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Февр. 2012  


Помог: 1 раз(а)




Есть задача обратиться к дважды перегруженному методу, менять средний класс крайне нежелательно(на нем много завязано уже). Из поисков в интернете нашел только такое
- но это не то ибо фактически классов наследников может быть больше, а перегрузок фактически две.
 
 Top
Ch_chov
Отправлено: 04 Декабря, 2013 - 07:29:08
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




grandparent:: Улыбка
 
 Top
Tek
Отправлено: 04 Декабря, 2013 - 08:07:54
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Февр. 2012  


Помог: 1 раз(а)




Эх если бы Закатив глазки

(Отредактировано автором: 04 Декабря, 2013 - 08:08:18)

 
 Top
EuGen Администратор
Отправлено: 04 Декабря, 2013 - 08:31:26
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. class Foo
  2. {
  3.    public function __set($name, $value)
  4.    {
  5.       $this->$name = 'Foo_'.$value;
  6.    }
  7. }
  8.  
  9. class Bar extends Foo
  10. {
  11.    public function __set($name, $value)
  12.    {
  13.       $this->$name = 'Bar_'.$value;
  14.    }
  15. }
  16.  
  17. class Baz extends Foo
  18. {
  19.    public function __set($name, $value)
  20.    {
  21.       $this->$name = 'Baz_'.$value;
  22.    }
  23. }
  24.  
  25. class Test extends Baz
  26. {
  27.    public function __set($name, $value)
  28.    {
  29.       $metadata = (new ReflectionClass($this))->getParentClass()->getParentClass();
  30.       return $metadata->getMethod(__FUNCTION__)->invokeArgs($this, [$name, $value]);
  31.    }
  32. }
  33.  
  34.  
  35. $obj = new Test;
  36. $obj->a = 'b';
  37. var_dump($obj->a);

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 04 Декабря, 2013 - 08:50:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Другая реализация примера EuGen'а без рефлексии и с неограниченным поиском самого первого объявленного метода.
PHP:
скопировать код в буфер обмена
  1. class Test extends Baz
  2. {
  3.    public function __set($name, $value)
  4.    {
  5.         $sNeedMethod = '__set';
  6.         $sClassName = get_called_class();
  7.         $sFirstClassHasMethod = NULL;
  8.         while (false !== ($sClassName = get_parent_class($sClassName))) {
  9.                 if (method_exists($sClassName, $sNeedMethod)) $sFirstClassHasMethod = $sClassName;
  10.                 }
  11.         if ($sFirstClassHasMethod)
  12.                 call_user_func(array($sFirstClassHasMethod, $sNeedMethod), $name, $value);
  13.    }
  14. }


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 04 Декабря, 2013 - 08:57:26
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Мелкий пишет:
call_user_func(array($sFirstClassHasMethod, $sNeedMethod), $name, $value);

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 04 Декабря, 2013 - 09:14:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




EuGen, именно что контекст этого объекта.
PHP:
скопировать код в буфер обмена
  1. $obj = new Test;
  2. $obj->a = 'b';
  3.  
  4. $obj2 = new Test;
  5. $obj2->foo = 'some';
  6.  
  7. var_dump($obj->a, $obj2->foo);

Цитата:
string(5) "Foo_b"
string(8) "Foo_some"

класс_родитель::метод_родителя - стандартный вызов, будучи вызван из метода в контексте объекта, метод родителя так же в контексте объекта, несмотря на внешне статический вызов ::.
parent::метод - лишь сокращённый аналог дабы не указывать имя родительского класса явно.

Комментарии к документации о том же: http://www.php.net/manual/en/key...-nekudotayim.php


-----
PostgreSQL DBA
 
 Top
Tek
Отправлено: 04 Декабря, 2013 - 09:26:51
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Февр. 2012  


Помог: 1 раз(а)




Всем спасибо. тему можно закрывать.
 
 Top
EuGen Администратор
Отправлено: 04 Декабря, 2013 - 09:28:00
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




EuGen пишет:
рефлексия - в общем случае - единственный выход.

В случае вызова по дереву вышестоящих родительских классов - разницы не будет в силу переноса контекста объекта (о чем была дана выше ссылка). Но общий случай состоит в том, что строковое имя может указывать не на один из классов-предков.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 04 Декабря, 2013 - 11:26:25
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




А разве нельзя в PHP обратится к родителю любого уровня по имени класса?
Где то я такое встречал то ли в яве то ли в С++ то ли в С#


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
armancho7777777 Супермодератор
Отправлено: 04 Декабря, 2013 - 16:27:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




getGrandParentClass (Отобразить)

PHP:
скопировать код в буфер обмена
  1. class A {}
  2. class B extends A {}
  3. class C extends B {}
  4. class D extends C {}
  5.  
  6.  
  7. var_dump(getGrandParentClass(new A())); // false
  8. var_dump(getGrandParentClass(new D())); // A
  9. var_dump(getGrandParentClass(new D(), 1)); // C
  10. var_dump(getGrandParentClass(new D(), 2)); // B
  11. var_dump(getGrandParentClass(new D(), 4)); // false

(Отредактировано автором: 04 Декабря, 2013 - 17:14:33)

 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Декабря, 2013 - 18:25:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB