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 :: Вызвать базовый метод в обход полиморфизму
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
вообще спасибо
оказалось, зря беспокоился и метод нигде не переопределяется, но в продолжение интересно темы хотелось бы поинтересоваться о следующем
при этом не будет никаких ворнингов?
интересно как оно транслятор определяет что нужно вызывать не статический метод?
----- Just do it
DlTA
Отправлено: 06 Сентября, 2013 - 16:31:02
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
Panoptik пишет:
// здесь я хочу получить 3 а не 5 вызвав метод именно этого класса а не дочернего
$a = $this->f(3);
ошибка в проектировании, плохой тон разрабатывать класс который для наследования, вопрос о том чей метод будет вызываться должен решать наследник а не родитель, и все сразу станет на свои места (Добавление) http://www.php.net/manual/ru/keyword.parent.php
Мелкий
Отправлено: 06 Сентября, 2013 - 16:41:03
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Нет, всё штатно, никаких предупреждение.
В том числе и $this доступен в вызванном методе.
А определяется, по-видимому, просто: если существует в классе не статичный метод с таким названием, то он и вызывается как метод объекта. И только если указано у метода static - он вызывается как статичный.
----- PostgreSQL DBA
EuGen
Отправлено: 06 Сентября, 2013 - 16:41:17
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Это - один из примеров во-первых, плохого дизайна приложения, а, во-вторых, плохой модели ООП в PHP.
Разыменование статических методов как обычных и наборот - работает в PHP (и не вызовет ошибки, но, например, при обращении к $this произойдёт ошибка времени исполнения, если метод вызван как статический).
Происходит это потому, что в PHP нет статических методов. Они все - обычные, просто статические имеют соответствующий флаг, и всё - это и есть отличие в результирующем после интерпретации опкоде. Из-за этого, например, невозможно инициировать вызов __callStatic, если происходит обращение к существующему нестатическому методу через оператор :: (вместо ожидаемого вызова __callStatic произойдёт вызов самого метода).
Решение через ::self неявно опирается на такое свойство PHP. Корректнее делать это через parent, ещё корректнее - соблюдать определённую Вами же иерархию классов и понимать, что $this - это экземпляр текущего класса, определённый в данный момент, и, соответственно, действовать сообразно этому.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Panoptik
Отправлено: 06 Сентября, 2013 - 17:00:43
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
EuGen, спасибо за развернутый ответ. думаю остальным тоже будет познавательно
на счет архитектуры как упоминал выше - зря беспокоился, и этот заветный метод никем не переопределяется
но про использование static открыл для себя новое
----- Just do it
LIME
Отправлено: 06 Сентября, 2013 - 17:02:58
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
EuGen как же вызывается статический метод если не было инстанциировано ни одного объекта?
EuGen
Отправлено: 06 Сентября, 2013 - 17:09:39
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
LIME
Как обычно. Тело метода хранится статически. Это объекты имеют данные, хранимые по смещениям своих экземпляров (и привязывающиеся к методу в момент вызова)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Panoptik
Отправлено: 06 Сентября, 2013 - 17:15:02
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
я уже перестал понимать суть. Где можно подробно и по возможности понятно почитать о том как на самом деле работает ООП (в частности классы) в php ?
----- Just do it
LIME
Отправлено: 06 Сентября, 2013 - 17:15:39
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
то есть при вызове метода не происходит выделение динамической памяти и переноса в нее кода как при вызовах обычных ф-ций?
тогда скорее в PHP все методы статические
EuGen
Отправлено: 06 Сентября, 2013 - 17:21:00
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Panoptik пишет:
Где можно подробно и по возможности понятно почитать о том как на самом деле работает ООП (в частности классы) в php ?
К сожалению, сходу не смогу сказать ресурсы, где бы можно было это прояснить для себя с учётом обоих требований. Все ресурсы, подозреваю, будут англоязычными. Я узнал многие подобные вещи из конференции SO, общаясь в том числе с разработчиками некоторых известных расширений PHP (в общем случае такие вопросы уходят за рамки обычных страниц руководств).
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.