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
Форумы портала PHP.SU :: Версия для печати :: Не хватает опыта понять=(
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Не хватает опыта понять=(

Страниц (1): [1]
 

1. Rimlanin - 17 Февраля, 2015 - 19:41:27 - перейти к сообщению
Здравствуйте всем! комментирую для себя все что происходит в опенкарте чтобы потом составить чтото наподобие 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. }


Спасибо!
2. Bio man - 17 Февраля, 2015 - 19:56:22 - перейти к сообщению
Оформи код.
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 не примет одно из ложных значений (смотри преобразование типов). Тут проще некуда, не понимаю откуда путаница
3. Rimlanin - 17 Февраля, 2015 - 21:44:19 - перейти к сообщению
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'

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

Я понимаю что это бред и такого не может быть, сайт то как то работает, просто вот я так читаю код и не въезжаю=(
4. skiphog - 17 Февраля, 2015 - 21:45:37 - перейти к сообщению
В файле 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()
5. Rimlanin - 17 Февраля, 2015 - 21:49:54 - перейти к сообщению
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! тогда все должно сойтись

Спасибо всем кто отвечает!
6. skiphog - 17 Февраля, 2015 - 22:49:50 - перейти к сообщению
Rimlanin пишет:
теперь буду копать откуда появится должен NULL!

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

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

(добавление)
Как вариант, можете на каждом этапе понавтыкать везде var_damp()`ов и посмотрите результаты выполнения каждой функции.
7. Rimlanin - 18 Февраля, 2015 - 06:25:57 - перейти к сообщению
[quote=skiphog] Благодарствую! кажется я понял в чем дело, дело в непонимании return, возвращении результата ибо если дальше вызваный метод в классе выполнился сгенерировал страницу или чтото там и выдал в экран то все скрипт отработал и передал результат пользователю уже, соответственно ничего не возвращается return'ом для последующей обработки.
Походу дела так

 

Powered by ExBB FM 1.0 RC1