tipos - Invocación dinámica del método de clase en PHP
self php (8)
Si trabajas dentro de una clase en PHP, te recomendaría utilizar la función __call sobrecargada en PHP5. Puedes encontrar la referencia aquí .
Básicamente __call hace por funciones dinámicas lo que __set y __get hacen por las variables en OO PHP5.
¿Hay alguna manera de invocar dinámicamente un método en la misma clase para PHP? No tengo la sintaxis correcta, pero estoy buscando hacer algo similar a esto:
$this->{$methodName}($arg1, $arg2, $arg3);
Solo omita los refuerzos:
$this->$methodName($arg1, $arg2, $arg3);
También puede usar call_user_func()
y call_user_func_array()
En mi caso.
$response = $client->{$this->requestFunc}($this->requestMsg);
Usando PHP SOAP.
Hay más de una forma de hacerlo:
$this->{$methodName}($arg1, $arg2, $arg3);
$this->$methodName($arg1, $arg2, $arg3);
call_user_func_array(array($this, $methodName), array($arg1, $arg2, $arg3));
Incluso puede usar la API de reflexión http://php.net/manual/en/class.reflection.php
¡Aún válido después de todos estos años! Asegúrese de recortar $ methodName si es contenido definido por el usuario. No pude conseguir que $ this -> $ methodName funcionara hasta que noté que tenía un espacio principal.
Puedes usar la Sobrecarga en PHP: Sobrecarga
class Test {
private $name;
public function __call($name, $arguments) {
echo ''Method Name:'' . $name . '' Arguments:'' . implode('','', $arguments);
//do a get
if (preg_match(''/^get_(.+)/'', $name, $matches)) {
$var_name = $matches[1];
return $this->$var_name ? $this->$var_name : $arguments[0];
}
//do a set
if (preg_match(''/^set_(.+)/'', $name, $matches)) {
$var_name = $matches[1];
$this->$var_name = $arguments[0];
}
}
}
$obj = new Test();
$obj->set_name(''Any String''); //Echo:Method Name: set_name Arguments:Any String
echo $obj->get_name();//Echo:Method Name: get_name Arguments:
//return: Any String
Puede almacenar un método en una sola variable usando un cierre:
class test{
function echo_this($text){
echo $text;
}
function get_method($method){
$object = $this;
return function() use($object, $method){
$args = func_get_args();
return call_user_func_array(array($object, $method), $args);
};
}
}
$test = new test();
$echo = $test->get_method(''echo_this'');
$echo(''Hello''); //Output is "Hello"
EDITAR: he editado el código y ahora es compatible con PHP 5.3. Otro ejemplo aquí