retorno llamada funciones ejemplo define call_user_func_array argument php

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''; }