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]   

> Без описания
Rimlanin
Отправлено: 17 Февраля, 2015 - 19:41:27
Post Id


Новичок


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


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




Здравствуйте всем! комментирую для себя все что происходит в опенкарте чтобы потом составить чтото наподобие mindmap как и что где вызываетсяя в какой последовательности обрабатывается, вообщем схему как работает эта цмс, загвоздка в классе Front возможны Вы подскажите
PHP:
скопировать код в буфер обмена
  1. public function dispatch($action, $error) {
  2.       $this->error = $error;
  3.  
  4. foreach ($this->pre_action as $pre_action) {
  5.            
  6.         $result = $this->execute($pre_action);
  7.  
  8. if ($result) {
  9. $action = $result;
  10.  
  11. break;
  12. }
  13. }
  14.  
  15. while ($action) {
  16. $action = $this->execute($action);
  17. }
  18.   }
  19.    
  20.    
  21.     private function execute($action) {
  22.        
  23. if (file_exists($action->getFile())) {
  24. require_once($action->getFile());
  25.  
  26.            
  27. $class = $action->getClass();
  28.            
  29.            $controller = new $class($this->registry);
  30.  
  31.            
  32. if (is_callable(array($controller, $action->getMethod()))) {
  33.                
  34.              $action = call_user_func_array(array($controller, $action->getMethod()), $action->getArgs());
  35. } else {
  36. $action = $this->error;
  37.  
  38. $this->error = '';
  39. }
  40. } else {
  41. $action = $this->error;
  42.  
  43. $this->error = '';
  44. }
  45.  
  46. return $action;
  47. }
  48. }


Конкретно непонятны здесь эти две конструкции как они читаются,что делают?
PHP:
скопировать код в буфер обмена
  1. if ($result) {
  2. $action = $result;
  3.  
  4. break;
  5. }
  6. }
  7.  
  8. while ($action) {
  9. $action = $this->execute($action);
  10. }


Спасибо!


Отредактировано модератором: Саныч, 18 Февраля, 2015 - 12:46:20
 
 Top
Bio man
Отправлено: 17 Февраля, 2015 - 19:56:22
Post Id


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


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


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




Оформи код.
PHP:
скопировать код в буфер обмена
  1. if ($result) {
  2.    $action = $result;
  3.    break;
  4. }
Если $result == true (смотри преобразование типов), то переменная $action принимает значение $result и цикл прекращается.
PHP:
скопировать код в буфер обмена
  1. while ($action) {
  2.    $action = $this->execute($action);
  3. }
Цикл выполняется до тех пор, пока $action не примет одно из ложных значений (смотри преобразование типов). Тут проще некуда, не понимаю откуда путаница
 
 Top
Rimlanin
Отправлено: 17 Февраля, 2015 - 21:44:19
Post Id


Новичок


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


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




1)Сначала вызывается метод dispatch в него передаются два аргумента ($action с 'common/home') и ($error = new Action с 'error/not_found)

2)Присваиваем второй аргумент свойству
3)Перебираем массив $this->pre_action (сорри не указал его изначально)в нем содержится
объект класса Action с 'common/maintenance'
4)Далее в $result записываем результат вызова метода execute($action) в него мы передали
объект класса Action с 'common/maintenance'
5)Дальше подключается нужный файл с 'common/maintenance' создается объект, запускается метод вообщем вроде ничего сложно

А далее...

возвращается return $action и присваивается $result

затем если $result TRUE то перезаписываем $action с 'common/home'

т.е. получается в $action у нас результат метода объекта с 'common/maintenance'


и далее...

Цикл While если результат TRUE то помещаем в $action результат вызова метода класса Action с 'common/maintenance'

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

Я понимаю что это бред и такого не может быть, сайт то как то работает, просто вот я так читаю код и не въезжаю=(
 
 Top
skiphog
Отправлено: 17 Февраля, 2015 - 21:45:37
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014  
Откуда: Киров, Россия


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




В файле index.php, после создания экземпляра класса Front, в его свойство $pre_action записывается массив объектов Action.
В свойствах объекста Action содержаться: путь до контроллера, имя класса контроллера и метод.

После добавления массива акшенов, вызывается метод dispatch($action,$error), где $action = текущий контроллер, который взят из $request и $error - экземляр класса Ошибки.

Что происходит дальше.
сначала в форыче бежим по $pre_action и кидаем каждый Action в метод execute(Action);

В execute проверяется, есть ли такой файл, класс, метод и если есть, то бросается это все дело в call_user_func_array()
и возвращается $result = null;
Если какя-нибудь проверка вернет false, в $result бросится экземляр класса ошибки.
На каждой итерации проверяется $result что там? null или объект? и если не null, то выходим из цикла, а в $action присваивается объект ошибки.

После выхода из forech заходим в цикл wile и бросим туда либо $action = который передали в dispatch($action,$error) либо объект с ошибкой и опять вызывается execute()
 
My status
 Top
Rimlanin
Отправлено: 17 Февраля, 2015 - 21:49:54
Post Id


Новичок


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


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




1)Сначала вызывается метод dispatch в него передаются два аргумента ($action с 'common/home') и ($error = new Action с 'error/not_found)

2)Присваиваем второй аргумент свойству
3)Перебираем массив $this->pre_action (сорри не указал его изначально)в нем содержится
объект класса Action с 'common/maintenance'
4)Далее в $result записываем результат вызова метода execute($action) в него мы передали
объект класса Action с 'common/maintenance'
5)Дальше подключается нужный файл с 'common/maintenance' создается объект, запускается метод вообщем вроде ничего сложно

А далее...

возвращается return $action и присваивается $result

затем если $result TRUE то перезаписываем $action с 'common/home'

т.е. получается в $action у нас результат метода объекта с 'common/maintenance'


и далее...

Цикл While если результат TRUE то помещаем в $action результат вызова метода класса Action с 'common/maintenance'

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

Я понимаю что это бред и такого не может быть, сайт то как то работает, просто вот я так читаю код и не въезжаю=(
(Добавление)
skiphog пишет:

В execute проверяется, есть ли такой файл, класс, метод и если есть, то бросается это все дело в call_user_func_array()
и возвращается $result = null;


Вот в чем криминал! теперь буду копать откуда появится должен NULL! тогда все должно сойтись

Спасибо всем кто отвечает!
 
 Top
skiphog
Отправлено: 17 Февраля, 2015 - 22:49:50
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014  
Откуда: Киров, Россия


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




Rimlanin пишет:
теперь буду копать откуда появится должен NULL!

Потому, что call_user_func_array() возвращает результат выполнения, а в данном контексте ничего не возвращается, поэтому и null.

Ситуация меняется, если вы включаете чпу c помощью seo_pro.
в call_user_func_array() сначала кидается контроллер ControllerCommonSeoPro, который в сою очередь вернет не null, а нужный Action, который опять бросается в call_user_func_array() и результатом уже будет null.

(добавление)
Как вариант, можете на каждом этапе понавтыкать везде var_damp()`ов и посмотрите результаты выполнения каждой функции.

(Отредактировано автором: 17 Февраля, 2015 - 22:54:16)

 
My status
 Top
Rimlanin
Отправлено: 18 Февраля, 2015 - 06:25:57
Post Id


Новичок


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


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




[quote=skiphog] Благодарствую! кажется я понял в чем дело, дело в непонимании return, возвращении результата ибо если дальше вызваный метод в классе выполнился сгенерировал страницу или чтото там и выдал в экран то все скрипт отработал и передал результат пользователю уже, соответственно ничего не возвращается return'ом для последующей обработки.
Походу дела так
 
 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