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 :: Вызов статического метода класса наследника ИЗ класса родителя

 PHP.SU

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


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

> Без описания
Arhat109
Отправлено: 28 Марта, 2013 - 15:14:00
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


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




Захотелось "странного" и задумался.
Скажем, есть такая связка классов:
PHP:
скопировать код в буфер обмена
  1.  
  2. class A {
  3.   public function metodA() {
  4.     echo "\nThie is a method for class A";
  5.     // тут к объекту-экземпляру можно обращаться через $this->...
  6.     // ... [b]А вот КАК тут вызвать статический метод класса ЭТОГО экземпляра?!?[/b]
  7.   }
  8.   statis public function staticA() {
  9.     echo "\nThis is a static method for class A";
  10.   }
  11. }
  12. class B extend A {
  13.   //... конструктор свойства объектов и "все дела"...
  14.  
  15.   static public function staticB() {
  16.     echo "\nThis is a static method from B";
  17.     // метод статический и доступа к объектам нет... поскольку нет объекта $this
  18.     // но к статическим методам класса "А" доступ есть parent::staticA();
  19.   }
  20. }
  21.  
  22. $var1 = new B();
  23.  
  24.  

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

То есть, фактически надо в реализации метода methodA() {} при обращении к статической функции staticB(), в качестве квалификатора имени класса "подставить" класс объекта $this. КАК?

Можно ли писать что-то типа такого: {a($this)}::staticB();
... или надо объявить в классе "А" статический метод с тем же именем... но тогда ... опять КАК указать квалификатор по типу объекта $this?
 
 Top
Мелкий Супермодератор
Отправлено: 28 Марта, 2013 - 15:16:28
Post Id



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


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


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




self::thisClassStaticMethod()?
?


-----
PostgreSQL DBA
 
 Top
Arhat109
Отправлено: 28 Марта, 2013 - 15:39:58
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


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




Мелкий пишет:
self::thisClassStaticMethod()?
?


так - не пойдет. Смотрите, реализация метода A::methodA()
PHP:
скопировать код в буфер обмена
  1.  
  2. class A {
  3.   static public function staticF() {
  4.     //требует перекрытия в дочернем классе.
  5.     return 'это класс А';
  6.   }
  7.  
  8.   public function methodA() {
  9.     $addition = //тут нужен тот самый вызов КлассОбъектаTHIS::staticF();
  10.     return 'Это метод базового класса А дополнен строкой из дочернего класса: '
  11.         . $addition
  12.     ;
  13.   }
  14. }
  15. class B extend A {
  16.   static public staticF() { return 'Это класс В'; }
  17. }
  18.  
  19. $var = new B();
  20. echo $var->methodA();
  21. // должна получится строка:
  22. // "Это метод базового класса А дополнен строкой из дочернего класса: Это класс В"
  23. // при этом возможно самостоятельное использование без создания объекта класса В:
  24. echo B::staticF();
  25.  


Дополнено:
Если в реализации в классе А метода methodA() указать префикс self:: то будет обращение к статической функции класса А, а нужно к той, которая от класса объекта $this.

(Отредактировано автором: 28 Марта, 2013 - 15:43:09)

 
 Top
esterio
Отправлено: 28 Марта, 2013 - 15:43:51
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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





?
 
 Top
Arhat109
Отправлено: 28 Марта, 2013 - 16:03:48
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


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




esterio пишет:
?


Непонятно, можно ли писать квалификатор static как имя класса.

Но, похоже разобрался. PHP позволяет в качестве квалификатора писать $var::staticMethod();
, а стало быть, похоже никто не мешает сделать так:

$className = get_class($this);
$addition = $className::staticF();

Улыбка
(Добавление)
Облом. В PHP5.2 такое решение вызывает ошибку на иврите... в 5.3 - похоже нормально работает...
(Добавление)
Ура! Есть решение и для PHP 5.2!

$addition = calc_user_func($className . '::staticF');

проблему решает полностью. Проверено. Улыбка
 
 Top
esterio
Отправлено: 28 Марта, 2013 - 17:55:55
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




Я Вам не виноват в ПХП 5.2. А читать доку нужно.

(Отредактировано автором: 28 Марта, 2013 - 17:56:26)

 
 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