2009-04-23 23 views
22

Dado que PHP's call_user_method() y call_user_method_array() están marcados como obsoletos, me pregunto qué alternativa se recomienda?Reemplazo recomendado para call_user_method obsoleto?

Una forma sería usar call_user_func(), porque al dar una matriz con un objeto y un nombre de método como el primer argumento hace lo mismo que las funciones obsoletas. Dado que esta función no está marcada como obsoleta, ¿supongo que la razón no es el uso sin estilo de POO?

La otra forma en que puedo pensar es en usar la Reflection API, que podría ser la alternativa más cómoda y orientada al futuro. Sin embargo, es más código y podría imaginar que es más lento que usar las funciones mencionadas anteriormente.

Lo que me interesa:

  • ¿Hay una técnica completamente nueva para llamar métodos de un objeto por su nombre?
  • ¿Cuál es el reemplazo más rápido/mejor/oficial?
  • ¿Cuál es el motivo de desaprobación?

Respuesta

24

Como dijiste call_user_func puede duplicar fácilmente el funcionamiento de esta función. ¿Cuál es el problema?

La página call_user_method incluso enumera como la alternativa:

<?php 
call_user_func(array($obj, $method_name), $parameter /* , ... */); 
call_user_func(array(&$obj, $method_name), $parameter /* , ... */); // PHP 4 
?> 

En lo que a qué esta desfasada, this posting explains it:

This is because the call_user_method() and call_user_method_array() functions can easily be duplicated by:

old way:
call_user_method($func, $obj, "method", "args", "go", "here");

new way:
call_user_func(array(&$obj, "method"), "method", "args", "go", "here");

Personalmente, probablemente iría con la variable sugerencia de variables publicada por Chad.

+0

No hay problema ... yo era sólo curiosidad;) – okoman

+0

Parece que la notificación de La desactivación en la documentación de PHP en 'call_user_method' debe apuntar hacia' call_user_func'. Lástima que no y tengo que buscar SO para la respuesta ... = D – Aaron

16

Puedes hacerlo usando variable variables, esto me parece el más limpio. En lugar de:

call_user_func(array($obj, $method_name), $parameter); 

lo hace:

$obj->{$method_name}($parameter); 
+0

El problema es cuando no tienes idea de qué función se llamará y si tiene o no parámetro, cuántos parámetros tiene , etc. Estoy usando AMFPHP para comunicarme a través de Flex y PHP y estoy creando una llamada de Gateway que me impedirá llamar PHP más de una vez desde Flex por tiempo. Necesitaré instanciar y llamar a más de un método y no tengo idea si Flex proporcionará parámetros y, si lo hace, estará en una matriz determinada. –

1

hacer algo así:

utilizo algo así en mi __construct método().

$params = array('a','b','c'); // PUT YOUR PARAMS IN $params DYNAMICALLY 

call_user_func_array(array($this, $this->_request), array($params)); 

primera argumento: ejemplo obect, segundo argumento: método para llamar, tercera argumento: params

Antes de comprobar si el método o clase también, con:

method_exists() 
class_exists() 

Saludos

0

si obtiene el siguiente error: Advertencia: call_user_func() espera que el parámetro 1 sea una devolución de llamada válida, el segundo miembro de la matriz no es un método válido en C: \ www \ file.php en línea X y el código de la siguiente manera:

call_user_func(array($this, $method)); 

uso (cadena) Declaración de $ nombre del método

call_user_func(array($this, (string)$method));