tag - php call function from string
¿Reemplazo recomendado para call_user_method en desuso? (4)
Dado que los call_user_method()
y call_user_method_array()
están marcados en desuso, me pregunto qué alternativa se recomienda.
Una forma sería usar call_user_func()
, ya que al dar una matriz con un objeto y un nombre de método, el primer argumento hace lo mismo que las funciones en desuso. Dado que esta función no está marcada como obsoleta, ¿asumo que la razón no es el uso no elegante de OOP?
La otra forma en que puedo pensar es usar la API de Reflection , que podría ser la alternativa más cómoda y orientada hacia el 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:
- ¿Existe una técnica completamente nueva para llamar a los métodos de un objeto por su nombre?
- ¿Cuál es el reemplazo más rápido / mejor / oficial?
- ¿Cuál es la razón de la desaprobación?
Como ha dicho, call_user_func
puede duplicar fácilmente el comportamiento de esta función. ¿Cuál es el problema?
La página call_user_method
incluso lo enumera como la alternativa:
<?php
call_user_func(array($obj, $method_name), $parameter /* , ... */);
call_user_func(array(&$obj, $method_name), $parameter /* , ... */); // PHP 4
?>
En cuanto a por qué esto fue desaprobado, esta publicación lo explica:
Esto se debe a que las
call_user_method()
ycall_user_method_array()
se pueden duplicar fácilmente mediante:vieja forma:
call_user_method($func, $obj, "method", "args", "go", "here");
nueva manera:
call_user_func(array(&$obj, "method"), "method", "args", "go", "here");
Personalmente, me gustaría ir con la sugerencia de variables variables publicada por Chad.
Haz algo como eso:
Uso algo así en mi método __construct ().
$params = array(''a'',''b'',''c''); // PUT YOUR PARAMS IN $params DYNAMICALLY
call_user_func_array(array($this, $this->_request), array($params));
1er argumento: instancia de objeto, 2do argumento: método a llamar, 3er argumento: params
Antes de que puedas probar si método o clase también, con:
method_exists()
class_exists()
Aclamaciones
Podrías hacerlo usando variables variables , esto me parece más limpio. En lugar de:
call_user_func(array($obj, $method_name), $parameter);
Tú lo haces:
$obj->{$method_name}($parameter);
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 la línea X y código como este:
call_user_func(array($this, $method));
declaración de uso (cadena) para $ nombre del método
call_user_func(array($this, (string)$method));