2011-04-19 5 views
1

Je cherche un joli équivalent en PHP à sa fonction call_user_func. Le problème que je rencontre avec cette fonction est qu'elle ne passe pas dans un "mode objet". Par cela, je veux dire que je ne peux pas utiliser $this et d'autres choses dans la classe, donc à peu près en deux mots: pas oop.PHP call_user_func alternative

je besoin de ce principe que je traite l'URL demandée, l'analyse syntaxique, et voir si tout est ok et ainsi de suite, et ensuite faire les lignes suivantes:

call_user_func(array(ucfirst($controller . "Controller"), '_initAction'), $param);  
call_user_func(array(ucfirst($controller . "Controller"), $action . 'Action'), $param); 

que je veux appeler dynamiquement le "Controller" et ses actions. Mais je ne peux pas utiliser $this dans les méthodes $action car ce n'est pas une POO.

Voici le message que je reçois:

Fatal error: Using $this when not in object context in E:\htdocs\wit\application\controller\InformationController.php on line 6 

J'espère donc que quelqu'un pourrait me aider.

Pourriez-vous également me dire si j'aborde ce problème de façon erronée? PS: S'il vous plaît ne me recommandez pas les frameworks MVC qui s'occupent de ce genre de choses. J'aime Zend, mais parfois, c'est juste trop lourd: ((J'ai besoin d'une configuration légère pour cela.)

+0

Votre utilisation de 'ucfirst' fait allusion à un autre problème. – mario

+0

J'ai demandé quelque chose de similaire récemment. Découvrez ma question: http://stackoverflow.com/questions/5549724/call-user-func-within-class-context-with-this-defined – romaninsh

Répondre

9

vous pouvez appeler la méthode un objet en objet dans le premier élément du rappel:

$class = ucfirst($controller . "Controller"); 
$controller = new $class(); 
call_user_func(array($controller, $action . 'Action'), $param); 

en fait, vous pouvez même utiliser

$controller = new $class(); 
$controller->{$action . 'Action'}(); 
+0

Je vais avec cette réponse car elle me convient le mieux - en fait sa réponse la plus simple en fait: D merci et tout le monde bien sûr aussi bien – Richard

+0

Comment passer un tableau de paramètres à travers la deuxième utilisation? J'ai essayé un tableau écrit dans les parenthèses() mais cela se traduit par "types d'opérandes non pris en charge" -Error. –

+0

où sont les params dans le second exemple? –

0

Regardez comment Glue appelle des fonctions définies par l'utilisateur Il peut vous diriger dans la bonne direction, puisque les utilisateurs définissent des classes . pour gérer les routes

<?php 
require_once('glue.php'); 
$urls = array(
    '/' => 'index' 
); 
class index { 
    function GET() { 
     echo "Hello, World!"; 
    } 
} 
glue::stick($urls); 
?> 
+0

C'est en fait très intéressant ... on dirait le routeur en zend cadre ... Je pourrais l'utiliser - merci pour cela. – Richard

+0

Votez si vous l'avez trouvé utile. – Sean

0

Si le point de votre question me manque complètement, je suis désolé. Il me semble que vous essayez d'appeler une méthode d'objet en utilisant call_user_func. Vous pouvez le faire, vous passez simplement un tableau avec l'objet comme premier index, et le nom de la chaîne comme deuxième index. Par exemple, supposons que vous ayez votre contrôleur "IndexController" avec "index" comme action/méthode.

class IndexController { 
    public function index() { 
     // $this available here 
    } 
} 

$controller = new IndexController(); 

// if you know your parameters all ahead of time 
call_user_func(array($controller, 'index'), $param1, $param2); 

// if you want to pass an unknown number of params 
call_user_func_array(array($controller, 'index'), $params); 
0
$view  = View::getInstance($config['view']); 
$err  = new ErrorController(array(), $view); 

//load the class and its method 
//pass the params to it 
$class  = ucfirst($controller . "Controller"); 
if (class_exists($class)) 
{ 
    $con = new $class($param, $view); 
    $act = $action . 'Action'; 
    if (method_exists($con, $act) ) 
    { 
     $con->$act(); 

    } 
    else 
    { 
     $view->setController("error"); 
     $view->setAction('index'); 
     $err->indexAction(); 
    } 
} 
else 
{ 
    $view->setController("error"); 
    $view->setAction('index'); 
    $err->indexAction(); 
} 

Voici donc ma solution comment je résolu mon problème. il est basé sur la solution @AlexAtNet et les parties de colle qui m'ont été recommandées par @Sean