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. etoYA - 27 Марта, 2012 - 23:26:55 - перейти к сообщению
Было
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class Router{
  4.         private $_query = array(), $_layout;
  5.        
  6.         function __construct(){
  7.                 $this->_query = explode ('/', trim($_SERVER['REQUEST_URI'], '/'));
  8.         }
  9.         function run(){
  10.                 $controller = !empty($this->_query[0]) ? ucfirst(strtolower($this->_query[0])) . 'Controller' : 'IndexController';
  11.                 $action = !empty($this->_query[1]) ? strtolower($this->_query[1]) : 'base';
  12.                 $parameters = $this->_query;
  13.                 if (!file_exists(ROOT.'/application/controllers/'.$controller.'.php')){
  14.                         $controller = 'ErrorController';
  15.                         $action = '_404';
  16.                 }
  17.                 $controller = new $controller($this);
  18.                 if (method_exists($controller,$action)){
  19.                         $controller->$action($parameters[2],$parameters[3],$parameters[4]);
  20.                 }
  21.                 else header('Location: /error/_404');
  22.         }
  23.         function setLayout($layout){
  24.                 $this->_layout = $layout;
  25.         }
  26.         function getLayout(){
  27.                 echo $this->_layout;
  28.         }
  29. }
  30. ?>
  31.  

Стало
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class FrontController{
  4.         private $_layout;
  5.        
  6.         function route(){
  7.                 $request = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
  8.                 $controller = !empty($request[0]) ? ucfirst(strtolower($request[0])) . 'Controller' : 'IndexController';
  9.                 $method = !empty($request[1]) ? strtolower($request[1]) : 'base';
  10.                 $class = $controller;
  11.                 $controller = new $controller($this);
  12.                 if (file_exists(ROOT.'/application/controllers/'.$class.'.php') AND method_exists($controller, $method)){
  13.                         $controller = new $controller->$method($request[2], $request[3], $request[4]);
  14.                 }
  15.                 else{
  16.                         $controller = 'ErrorController';
  17.                         $method = '_404';
  18.                 }
  19.         }
  20.         function setLayout($name){
  21.                 $this->_layout = $name;
  22.         }
  23.         function getLayout(){
  24.                 return $this->_layout;
  25.         }      
  26. }
  27. ?>
  28.  

(Добавление)
CODE (htmlphp):
скопировать код в буфер обмена
  1. Fatal error: Class name must be a valid object or a string in Z:\home\176.101.6.116\www\application\controllers\FrontController.php on line 12


Это
PHP:
скопировать код в буфер обмена
  1. $controller = new $controller->$method($request[2], $request[3], $request[4]);
2. DlTA - 27 Марта, 2012 - 23:30:07 - перейти к сообщению
лучше бы коментов добавил
3. etoYA - 27 Марта, 2012 - 23:30:24 - перейти к сообщению
DlTA, сек.
4. DlTA - 27 Марта, 2012 - 23:31:40 - перейти к сообщению
etoYA пишет:
oller = new $controller->$method($request[2], $request[3], $request[4]);

это попытка вызвать конструктор
или статический метод?
5. etoYA - 27 Марта, 2012 - 23:34:54 - перейти к сообщению
DlTA, это моя глупость, во время комментирования её обнаружил).Спасибо
(Добавление)
И понял еще, что в 1 условие не запихнуть проверку метода и класса.
(Добавление)
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class FrontController{
  4.         private $_layout;
  5.        
  6.         function route(){
  7.                 $request = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
  8.                 $controller = !empty($request[0]) ? ucfirst(strtolower($request[0])) . 'Controller' : 'IndexController';
  9.                 $method = !empty($request[1]) ? strtolower($request[1]) : 'base';
  10.                
  11.                 if (!file_exists('application/controllers/'.$controller.'.php')){
  12.                         $controller = 'ErrorController';
  13.                         $method = '_404';
  14.                 }
  15.                 $controller = new $controller($this);
  16.                 if (!method_exists($controller, $method)){
  17.                         $controller = 'ErrorController';
  18.                         $method = '_404';                      
  19.                 }
  20.                 else{
  21.                         $controller->$method($request[2], $request[3], $request[4]);
  22.                 }
  23.         }
  24.         function setLayout($name){
  25.                 $this->_layout = $name;
  26.         }
  27.         function getLayout(){
  28.                 return $this->_layout;
  29.         }      
  30. }
  31. ?>
  32.  


Вот исправил, но что-то мне не нравится проверка метода и класса...
А именно повторение
PHP:
скопировать код в буфер обмена
  1. $controller = 'ErrorController';
  2. $method = '_404';  

(Добавление)
Заменил на
PHP:
скопировать код в буфер обмена
  1. throw new ErrorController('404 error');

И все же, как то не так..

 

Powered by ExBB FM 1.0 RC1