php - llamada - compruebe si la función existe en la clase antes de llamar a call_user_func()
php callable argument (4)
En el siguiente código, llamo a una clase con call_user_func()
.
if(file_exists(''controller/'' . $this->controller . ''.controller.php'')) {
require(''controller/'' . $this->controller . ''.controller.php'');
call_user_func(array($this->controller, $this->view));
} else {
echo ''error: controller not exists <br/>''. ''controller/'' . $this->controller . ''.controller.php'';
}
Digamos que el controlador tiene el siguiente código.
class test {
static function test_function() {
echo ''test'';
}
}
Cuando llamo a call_user_func(''test'', ''test_function'')
no hay problema. Pero cuando llamo a una función que no existe, no funciona. Ahora quiero comprobar primero si existe la función en la prueba de clase, antes de llamar a la función call_user_func
.
¿Existe una función que verifique si en una clase existe una función o si hay otra manera de verificar esto?
Desde PHP 5.3 también puedes usar
if(method_exists($this, $model))
return forward_static_call([$this, $model],$extra, $parameter);
Estás buscando method_exists() para empezar. Pero lo que debe comprobar también es si el método es o no llamable . Esto se hace mediante la útil función is_callable
:
if (method_exists($this->controller, $this->view)
&& is_callable(array($this->controller, $this->view)))
{
call_user_func(
array($this->controller, $this->view)
);
}
Pero eso es solo el comienzo de las cosas. Su fragmento contiene explícitamente llamadas obligatorias, lo que sugiere que no está utilizando un autoloader .
Lo que es más: todo lo que estás haciendo es verificar file_exists
, no si la clase ya estaba cargada. Su código, entonces, generará un error fatal si, por oportunidad, su fragmento se ejecuta dos veces con los mismos valores para $this->controller
.
Comience a solucionar esto, como mínimo, cambiando su require
a require_once
...
Puedes usar la función php method_exists()
:
if (method_exists(''ClassName'',''method_name''))
call_user_func(etc...);
o también:
if (method_exists($class_instance,''method_name''))
call_user_func(etc...);
Use method_exists($this->controller, $this->view)
. Para su ejemplo:
if(file_exists(''controller/'' . $this->controller . ''.controller.php'') &&
method_exists($this->controller,$this->view)) {
require(''controller/'' . $this->controller . ''.controller.php'');
call_user_func(array($this->controller, $this->view));
} else {
echo ''error: controller or function not exists <br/>''. ''controller/'' . $this->controller . ''.controller.php'';
}