2010-12-11 21 views
5

Acabo de construirme una función que recupera la cadena URI y la convierte en una matriz como se muestra a continuación. Este ejemplo se basa en la URL de http://mydomain.com/mycontroller/mymethod/varPHP: ¿Llamar a una clase desde una matriz?

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

Si escribo new $myArray[0];, voy a cargar la clase myController, pero puedo hacer una función que se encarga de la eventual existencia de métodos y de su vocación con sus respectivas variables?

Respuesta

8

No estoy seguro de lo que entendemos por "se encarga de la eventual existencia de métodos y de su vocación con sus respectivas variables", pero que podría ser después de call_user_func_array:

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

Si quieres hacer eso para la instancia concreta que creó con $controller = new $myArray(0), reemplace $myArray[0] con $controller, por ej.

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

o pasar new $myArray[0] si no se preocupan por la instancia que se perdieron después de la llamada

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

De lo contrario obtendrá un aviso E_STRICT y no puede hacer referencia $this en cualquier myMethod es. También vea el PHP manual on possible callback formats.


Para validar el método y la clase existen en realidad, puede utilizar

Ejemplo:

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

Por favor, aclarar sus colas si se quiere decir algo más. On a sidenote, this was probably answered before, pero como no estoy seguro de cuál es la pregunta, tampoco estoy seguro de cuál elegir.

+0

esto sólo funciona con métodos estáticos, de lo que necesita una instancia de la clase @kemp –

+0

no es cierto, pero agregó una aclaración. Creo que eso es lo que querías decir. – Gordon

+0

tienes razón, mi mal –

1

supongo que esto también funcionaría:

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