2013-05-02 3 views
1

J'ai un problème et je n'ai pas idée de la façon de slove cela.Mvc Le nom de la méthode doit être une chaîne

Problème sur ce code de ligne:

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

Tous les autres succès du contrôleur fin de travail chargé, mais j'ai erreur fatale pour cela.

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

Vérifiez mon code:

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

Que fait 'var_dump ($ this-> action)' s'il est placé dans le constructeur? – Shoe

Répondre

0

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

L'erreur est déclenchée parce que vous essayez d'utiliser NULL pendant que l'interprète attend une chaîne.

Comme votre var_dump montre, $this->action est donc NULL l'interpolation de chaîne $this->{$this->action}(); est traduit $this->{NULL}(); qui ne peut pas être appelé.

+0

Vérifiez la source complète. http://www.nathandavison.com/posts/view/9/custom-php-mvc-tutorial-part-3-controllers – Ivan

Questions connexes