Покинул форум
Сообщений всего: 40
Дата рег-ции: Февр. 2010
Помог: 0 раз(а)
Здравствуйте, товарищи!
К сожалению, в жизни редко получается следовать совету "начинать нужно с начала". Так и с PHP у меня. Начинать пришлось из середины откуда-то. А в середине, как известно мы встречаемся с ООП. И сидит оно в готовых движках. В данном случае - в LiveStreet. И стоит только начать думать, что я начинаю в нем что-то понимать, как тут же что-нибудь убеждает в обратном.
Теперь, собственно, вопрос.
В LS, в одном из классов есть такая функция:
Проблемы тут у меня возникают в понимании 7-й и 10-й строки.
Если я правильно понял, в них вызываются некие методы Viewer_VarAssign() и Viewer_Display(), принадлежащие данному классу, или на худой конец - материнскому. Однако, ни в данном ни в материнском классах нет никаких описаний методов Viewer_VarAssign() и Viewer_Display()! Я перекопал весь движок и пришел к выводу, что этих описаний нету также и в дочерних классах, и в подключаемых модулях и внешних библиотеках! Как такое может быть? Мне казалось, при попытке выполнить такой скрипт должна вылезти фатальная ошибка, что-нибудь в духе fatal error: try to call undefine function on line ... in ... Однако все работает!
Я правильно понимаю, что нечто с двумя скобками в конце somthing() - это метод, и что конструкция $this-> служит для получения доступа к методу данного класса?
З.Ы. Спрашиваю тут, а не в форумах по LS, т.к. вопрос, по-моему, скорее про PHP-шный синтаксис.
AxelFoley
Отправлено: 17 Февраля, 2010 - 04:49:06
Новичок
Покинул форум
Сообщений всего: 1
Дата рег-ции: Окт. 2009
Помог: 0 раз(а)
Сейчас посмотрел, просто напросто метод Exec() (данного класса), нигде не разу не вызывается, а в других классах метод Exec() уже переопределен.Вроде так.
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
Помню копал этот движок)) Все дело в магическом методе __call. Как ты видишь метод называется Viewer_Display, название метода парситься и преобразуется к такому виду Viewer->Display
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Bertolomych пишет:
Я правильно понимаю, что нечто с двумя скобками в конце somthing() - это метод, и что конструкция $this-> служит для получения доступа к методу данного класса?
Все верно однако во-первых методы к классе могут наследоваться от родительского класса - а во-вторых в классах на PHP существуют динамические способы создания и выполнения методов - вам привелии в пример реализацию через __call хотя существуют и другие методы - например одна функция может динамически создавать другую функцию внутри данного класса (Точнее данной инстанции класса
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Bertolomych
Отправлено: 17 Февраля, 2010 - 17:18:01
Новичок
Покинул форум
Сообщений всего: 40
Дата рег-ции: Февр. 2010
Помог: 0 раз(а)
AxelFoley пишет:
просто напросто метод Exec() (данного класса), нигде не разу не вызывается
Нет-нет. Exec() именно этого класса вызывается, собственно, из index.php
movEAX пишет:
Как ты видишь метод называется Viewer_Display, название метода парситься и преобразуется к такому виду Viewer->Display
да-да, я тоже предполагал, что именно так там все и происходит, тем более, что в классе Viewer есть меитоды и Display() и VarAssign(). Я только не понял, а зачем, собственно выделывать такой финт ушами?
JustUserR
Отправлено: 17 Февраля, 2010 - 17:20:52
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Bertolomych пишет:
Я только не понял, а зачем, собственно выделывать такой финт ушами?
Если у вас экземпляр одного класса находится внутри экземпляра другого и вы не хотите чтобы их можно было проихвольно изменять извне с помощью двойного использования -> то такой интерфейс позволяет спратать этот факт
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Bertolomych
Отправлено: 17 Февраля, 2010 - 17:27:38
Новичок
Покинул форум
Сообщений всего: 40
Дата рег-ции: Февр. 2010
Помог: 0 раз(а)
JustUserR пишет:
в классах на PHP существуют динамические способы создания и выполнения методов
Блин, колдунство какое-то! Никогда даже и не слышал об таком..
А что есть инстанция класса?
З.Ы. да.. и еще.. а этот самый __call - это фишка из арсенала PHP, или это местный лайвстритный прибамбас? т.к. эти два подчеркивания впереди они как-то по-особому интерпретируются или это просто один из символов? (Добавление)
Ага. понял. у меня был просто старый учебник PHP. __call - это метод из арсенала php-5, которая вызывается в случае обращения к неопределенному методу. Ну тогда все понятно.
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Bertolomych пишет:
Блин, колдунство какое-то! Никогда даже и не слышал об таком..
А что есть инстанция класса?
Этим часто не пользуются но помню летом и потом еще осенью здесь на форуме было обсуждения как раз вопроса динамического создания методов в классе - а инстанция класса это экземпляр
В общем решение данного вопроса сводится либо к eval внутри класса и описанию в нем нового метода либо создание этого метода с помощью lambda-функции (Про свойства вопрос тоже может стоят - ведь хоть они создаются динамически при обращении к нем все - но все равно так для них автоматически устанавливается модификатор доступа private) Но на самом деле не все так прозравно поэтому я и употрбеил фразу инстанция класса а не экзмепляр - потому что в зависимости от подоза функции будут создаваться в разных областях видимости и вызываться в разных конткетсах
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.