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]   

> Описание: Снова про ООП и несчастный $this->
Bertolomych
Отправлено: 17 Февраля, 2010 - 01:53:06
Post Id



Новичок


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


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




Здравствуйте, товарищи!
К сожалению, в жизни редко получается следовать совету "начинать нужно с начала". Так и с PHP у меня. Начинать пришлось из середины откуда-то. А в середине, как известно мы встречаемся с ООП. И сидит оно в готовых движках. В данном случае - в LiveStreet. И стоит только начать думать, что я начинаю в нем что-то понимать, как тут же что-нибудь убеждает в обратном.

Теперь, собственно, вопрос.
В LS, в одном из классов есть такая функция:
PHP:
скопировать код в буфер обмена
  1.  
  2. public function Exec() {
  3.                 $this->oEngine=Engine::getInstance();
  4.                 $this->oEngine->InitModules();
  5.                 $this->oEngine->InitHooks();
  6.                 $this->ExecAction();
  7.                 $this->AssignVars();
  8.                 $this->Viewer_VarAssign();
  9.                 $this->oEngine->ShutdownModules();
  10.                 $this->Viewer_Display($this->oAction->GetTemplate());
  11.         }
  12.  


Проблемы тут у меня возникают в понимании 7-й и 10-й строки.
Если я правильно понял, в них вызываются некие методы Viewer_VarAssign() и Viewer_Display(), принадлежащие данному классу, или на худой конец - материнскому. Однако, ни в данном ни в материнском классах нет никаких описаний методов Viewer_VarAssign() и Viewer_Display()! Я перекопал весь движок и пришел к выводу, что этих описаний нету также и в дочерних классах, и в подключаемых модулях и внешних библиотеках! Как такое может быть? Мне казалось, при попытке выполнить такой скрипт должна вылезти фатальная ошибка, что-нибудь в духе fatal error: try to call undefine function on line ... in ... Однако все работает! Что такое?
Я правильно понимаю, что нечто с двумя скобками в конце somthing() - это метод, и что конструкция $this-> служит для получения доступа к методу данного класса?

З.Ы. Спрашиваю тут, а не в форумах по LS, т.к. вопрос, по-моему, скорее про PHP-шный синтаксис.
 
 Top
AxelFoley
Отправлено: 17 Февраля, 2010 - 04:49:06
Post Id



Новичок


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


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




Сейчас посмотрел, просто напросто метод Exec() (данного класса), нигде не разу не вызывается, а в других классах метод Exec() уже переопределен.Вроде так.

(Отредактировано автором: 17 Февраля, 2010 - 04:49:55)

 
 Top
movEAX
Отправлено: 17 Февраля, 2010 - 07:17:22
Post Id



Частый посетитель


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


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




Помню копал этот движок)) Все дело в магическом методе __call. Как ты видишь метод называется Viewer_Display, название метода парситься и преобразуется к такому виду Viewer->Display

(Отредактировано автором: 17 Февраля, 2010 - 07:19:13)



-----
армия.. самое убогое место
 
 Top
JustUserR
Отправлено: 17 Февраля, 2010 - 16:54:44
Post Id



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


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


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




Bertolomych пишет:
Я правильно понимаю, что нечто с двумя скобками в конце somthing() - это метод, и что конструкция $this-> служит для получения доступа к методу данного класса?
Все верно однако во-первых методы к классе могут наследоваться от родительского класса - а во-вторых в классах на PHP существуют динамические способы создания и выполнения методов - вам привелии в пример реализацию через __call хотя существуют и другие методы - например одна функция может динамически создавать другую функцию внутри данного класса (Точнее данной инстанции класса Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Bertolomych
Отправлено: 17 Февраля, 2010 - 17:18:01
Post Id



Новичок


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


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




AxelFoley пишет:
просто напросто метод Exec() (данного класса), нигде не разу не вызывается

Нет-нет. Exec() именно этого класса вызывается, собственно, из index.php

movEAX пишет:
Как ты видишь метод называется Viewer_Display, название метода парситься и преобразуется к такому виду Viewer->Display

да-да, я тоже предполагал, что именно так там все и происходит, тем более, что в классе Viewer есть меитоды и Display() и VarAssign(). Я только не понял, а зачем, собственно выделывать такой финт ушами?
 
 Top
JustUserR
Отправлено: 17 Февраля, 2010 - 17:20:52
Post Id



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


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


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




Bertolomych пишет:
Я только не понял, а зачем, собственно выделывать такой финт ушами?
Если у вас экземпляр одного класса находится внутри экземпляра другого и вы не хотите чтобы их можно было проихвольно изменять извне с помощью двойного использования -> то такой интерфейс позволяет спратать этот факт


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Bertolomych
Отправлено: 17 Февраля, 2010 - 17:27:38
Post Id



Новичок


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


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




JustUserR пишет:
в классах на PHP существуют динамические способы создания и выполнения методов

Блин, колдунство какое-то! Глазки в кучку Никогда даже и не слышал об таком..
А что есть инстанция класса?

З.Ы. да.. и еще.. а этот самый __call - это фишка из арсенала PHP, или это местный лайвстритный прибамбас? т.к. эти два подчеркивания впереди они как-то по-особому интерпретируются или это просто один из символов?
(Добавление)
Ага. понял. у меня был просто старый учебник PHP. Улыбка __call - это метод из арсенала php-5, которая вызывается в случае обращения к неопределенному методу. Ну тогда все понятно.

Спасибо всем!

(Отредактировано автором: 17 Февраля, 2010 - 17:36:03)

 
 Top
JustUserR
Отправлено: 17 Февраля, 2010 - 17:58:25
Post Id



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


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


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




Bertolomych пишет:
Блин, колдунство какое-то! Никогда даже и не слышал об таком..
А что есть инстанция класса?
Этим часто не пользуются но помню летом и потом еще осенью здесь на форуме было обсуждения как раз вопроса динамического создания методов в классе - а инстанция класса это экземпляр Улыбка
В общем решение данного вопроса сводится либо к eval внутри класса и описанию в нем нового метода либо создание этого метода с помощью lambda-функции (Про свойства вопрос тоже может стоят - ведь хоть они создаются динамически при обращении к нем все - но все равно так для них автоматически устанавливается модификатор доступа private) Но на самом деле не все так прозравно поэтому я и употрбеил фразу инстанция класса а не экзмепляр - потому что в зависимости от подоза функции будут создаваться в разных областях видимости и вызываться в разных конткетсах


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB