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]   

> Без описания
Panoptik
Отправлено: 06 Сентября, 2013 - 16:20:16
Post Id



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


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


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




всем привет

вот случилось у меня. и что-то не соображу
есть 2 класса: родительский и наследник

PHP:
скопировать код в буфер обмена
  1.  
  2. class A {
  3.  
  4.   public function f($a) {
  5.     return $a;
  6.   }
  7.  
  8.   public function myProblemHere() {
  9.      //some code here
  10.  
  11.      // здесь я хочу получить 3 а не 5 вызвав метод именно этого класса а не дочернего
  12.      $a = $this->f(3);
  13.  
  14.      //some code here
  15.   }
  16.  
  17. }
  18.  
  19. class B extends A {
  20.  
  21.   public function f($a) {
  22.      return $a + 2;
  23.   }
  24.  
  25. }
  26.  
  27.  


кто что посоветует?


-----
Just do it
 
 Top
Мелкий Супермодератор
Отправлено: 06 Сентября, 2013 - 16:26:05
Post Id



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


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


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




Решение немного совсем не очевидное, но:

Нет, это не вызов статического метода.

Тем не менее, это штатное поведение, в мануале краткого очерка заслужило: http://www.php.net/manual/ru/key...-nekudotayim.php


-----
PostgreSQL DBA
 
 Top
Panoptik
Отправлено: 06 Сентября, 2013 - 16:29:43
Post Id



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


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


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




вообще спасибо
оказалось, зря беспокоился и метод нигде не переопределяется, но в продолжение интересно темы хотелось бы поинтересоваться о следующем

при этом не будет никаких ворнингов?
интересно как оно транслятор определяет что нужно вызывать не статический метод?


-----
Just do it
 
 Top
DlTA
Отправлено: 06 Сентября, 2013 - 16:31:02
Post Id



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


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


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




Panoptik пишет:
// здесь я хочу получить 3 а не 5 вызвав метод именно этого класса а не дочернего
     $a = $this->f(3);
 
ошибка в проектировании, плохой тон разрабатывать класс который для наследования, вопрос о том чей метод будет вызываться должен решать наследник а не родитель, и все сразу станет на свои места
(Добавление)
http://www.php.net/manual/ru/keyword.parent.php
 
 Top
Мелкий Супермодератор
Отправлено: 06 Сентября, 2013 - 16:41:03
Post Id



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


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


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




Нет, всё штатно, никаких предупреждение.
В том числе и $this доступен в вызванном методе.

А определяется, по-видимому, просто: если существует в классе не статичный метод с таким названием, то он и вызывается как метод объекта. И только если указано у метода static - он вызывается как статичный.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 06 Сентября, 2013 - 16:41:17
Post Id


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


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


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




Это - один из примеров во-первых, плохого дизайна приложения, а, во-вторых, плохой модели ООП в PHP.
Разыменование статических методов как обычных и наборот - работает в PHP (и не вызовет ошибки, но, например, при обращении к $this произойдёт ошибка времени исполнения, если метод вызван как статический).
Происходит это потому, что в PHP нет статических методов. Они все - обычные, просто статические имеют соответствующий флаг, и всё - это и есть отличие в результирующем после интерпретации опкоде. Из-за этого, например, невозможно инициировать вызов __callStatic, если происходит обращение к существующему нестатическому методу через оператор :: (вместо ожидаемого вызова __callStatic произойдёт вызов самого метода).
Решение через ::self неявно опирается на такое свойство PHP. Корректнее делать это через parent, ещё корректнее - соблюдать определённую Вами же иерархию классов и понимать, что $this - это экземпляр текущего класса, определённый в данный момент, и, соответственно, действовать сообразно этому.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Panoptik
Отправлено: 06 Сентября, 2013 - 17:00:43
Post Id



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


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


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




EuGen, спасибо за развернутый ответ. думаю остальным тоже будет познавательно

на счет архитектуры как упоминал выше - зря беспокоился, и этот заветный метод никем не переопределяется

но про использование static открыл для себя новое


-----
Just do it
 
 Top
LIME
Отправлено: 06 Сентября, 2013 - 17:02:58
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




EuGen как же вызывается статический метод если не было инстанциировано ни одного объекта?
 
 Top
EuGen Администратор
Отправлено: 06 Сентября, 2013 - 17:09:39
Post Id


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


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


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




LIME
Как обычно. Тело метода хранится статически. Это объекты имеют данные, хранимые по смещениям своих экземпляров (и привязывающиеся к методу в момент вызова)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Panoptik
Отправлено: 06 Сентября, 2013 - 17:15:02
Post Id



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


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


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




я уже перестал понимать суть. Где можно подробно и по возможности понятно почитать о том как на самом деле работает ООП (в частности классы) в php ?


-----
Just do it
 
 Top
LIME
Отправлено: 06 Сентября, 2013 - 17:15:39
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




то есть при вызове метода не происходит выделение динамической памяти и переноса в нее кода как при вызовах обычных ф-ций?
тогда скорее в PHP все методы статические
 
 Top
EuGen Администратор
Отправлено: 06 Сентября, 2013 - 17:21:00
Post Id


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


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


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




Panoptik пишет:
Где можно подробно и по возможности понятно почитать о том как на самом деле работает ООП (в частности классы) в php ?

К сожалению, сходу не смогу сказать ресурсы, где бы можно было это прояснить для себя с учётом обоих требований. Все ресурсы, подозреваю, будут англоязычными. Я узнал многие подобные вещи из конференции SO, общаясь в том числе с разработчиками некоторых известных расширений PHP (в общем случае такие вопросы уходят за рамки обычных страниц руководств).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 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