2010-12-11 8 views
5

Je viens de créer moi-même une fonction qui récupère la chaîne d'URI et la transforme en un tableau comme indiqué ci-dessous. Cet exemple est basé sur l'URL de http://mydomain.com/mycontroller/mymethod/varPHP: Appeler une classe à partir d'un tableau?

Array 
(
    [0] => mycontroller 
    [1] => mymethod 
    [2] => var 
) 

Si j'écris new $myArray[0];, je vais charger la classe myController, mais puis-je faire une fonction qui gère l'existence éventuelle des méthodes et leur appel avec leurs variables respectives?

Répondre

8

Je ne sais pas ce que vous entendez par « poignées l'existance éventuelle des méthodes et leur appel à leurs variables respectives », mais vous pourriez être après call_user_func_array:

call_user_func_array(
    array($myArray[0], $myArray[1]), 
    array($myArray[2]) 
); 

Si vous voulez faire pour l'instance concrète que vous avez créée avec $controller = new $myArray(0), remplacez $myArray[0] par $controller, par exemple

$controller = new $myArray(0); 
call_user_func_array(
    array($controller, $myArray[1]), 
    array($myArray[2]) 
); 

ou passer new $myArray[0] si vous ne se soucient de l'instance étant perdu après l'appel

call_user_func_array(
    array(new $myArray[0], $myArray[1]), 
    array($myArray[2]) 
); 

Sinon, vous aurez un avis E_STRICT et ne peut pas faire référence à $this dans tout ce qui est myMethod. Voir aussi le PHP manual on possible callback formats.


Pour valider la méthode et la classe existe en fait, vous pouvez utiliser

Exemple:

if (method_exists($myArray[0], $myArray[1])) { 
    call_user_func_array(*/ … */) 
} 

S'il vous plaît préciser vos ques tion si quelque chose d'autre est signifié. On a sidenote, this was probably answered before, mais comme je ne suis pas sûr de la question, je ne sais pas non plus lequel choisir.

+0

cela ne fonctionne avec des méthodes statiques, sinon vous avez besoin d'une instance de la classe –

+0

@kemp pas vrai, mais il a ajouté des précisions. Je pense que c'est ce que tu voulais dire. – Gordon

+0

vous avez raison, mon mauvais –

1

Je suppose que cela fonctionnerait aussi:

$obj = new $myArray[0]; 
$obj->{$myArray[1]}($myArray[2]); 
Questions connexes