2013-05-02 44 views
1

我有问题,我没有想法如何解决这个问题。Mvc方法名称必须是字符串

问题在这一行代码:

public function ExecuteAction() { 
     return $this->{$this->action}(); 
    } 

所有其他做工精细控制器成功加载,但我对这个致命的错误。

Fatal error: Method name must be a string in D:\xampp\htdocs\Workplace\MVC\lib\BaseController.php on line 27

检查我的代码:

的index.php

$fController = new FController($_GET); 
$controller = $fController->CreateController(); 
$controller->ExecuteAction(); 

Fcontorler

public function createController() 
    { 
     if(class_exists($this->controller)) { 
      $parent = class_parents($this->controller); 
      if(in_array('BaseController', $parent)) { 
       if(method_exists($this->controller, $this->action)) { 
        return new $this->controller($this->action, $this->url); 
       }else { 
        echo "Method no exists"; 
       } 
      }else { 
       echo "Bad Controller"; 
      } 
     } else { 
      echo "Controller ". $this->controller . " class no exists"; 
     } 
    } 

BaseController

abstract class BaseController { 

    protected $urlvalues; 
    protected $action; 

    /* 
    * Construct 
    * 
    * @param string $action 
    * @param array $url 
    * 
    */ 

    public function __construct($action, $urlvalues) { 
     $this->action = $action; 
     $this->urlvalues = $urlvalues; 
    } 

    /* 
    * Execute acction 
    * 
    */ 

    public function ExecuteAction() { 
     return $this->{$this->action}(); 
    } 

localhost/Workplace/MVC/index.php?controller=hello&action=say&id=5

+0

如果将var_dump($ this-> action)放置在构造函数中,它会输出什么内容? – Shoe 2013-05-02 14:14:14

回答

0

var_dump($controller); object(Hello)#2 (2) { ["urlvalues":protected]=> NULL ["action":protected]=> NULL }

,因为你要使用NULL而解释期待一个字符串被触发的错误。

随着你var_dump显示,$this->actionNULL因此串插$this->{$this->action}();被翻译成$this->{NULL}();不能叫。

+0

查看完整的源代码。 http://www.nathandavison.com/posts/view/9/custom-php-mvc-tutorial-part-3-controllers – Ivan 2013-05-02 14:18:18

相关问题