que - php is method exist
¿Cuál es exactamente la diferencia entre is_callable y function_exists en PHP? (5)
Cuando se usa con una función (no un método de clase) no hay diferencia, excepto que function_exists
es un poco más rápido.
Pero cuando se usa para verificar la existencia de métodos en una clase, no se puede usar function_exists
. Tendrás que usar is_callable
o method_exists
.
Estoy trabajando en un proyecto, en el que estoy usando una función obsoleta de la versión anterior. Pero no quiero que mi script se detenga si se usa en la versión anterior. Así que estoy comprobando si la función existe y si no la está creando, de nuevo.
Pero, ¿cuál es la diferencia entre function_exists
y is_callable
en php y cuál es mejor para el usuario?
if(!is_callable(''xyz'')) {
function xyz() {
// code goes here
}
}
O
if(!function_exists(''xyz'')) {
function xyz() {
// code goes here
}
}
Cuando se usa en el contexto de la clase, is_callable
devuelve true para los métodos de clase accesibles, es decir, métodos públicos, pero method_exists
devuelve true para todos los métodos: público, protegido y privado. function_exists
hace lo mismo que method_exists
fuera de contextos de clase.
La función is_callable
acepta no solo nombres de funciones, sino también otros tipos de callbacks de callbacks :
-
Foo::method
-
array("Foo", "method")
-
array($obj, "method")
- Cierres y otros objetos invocables (PHP 5.3)
Por is_callable
tanto, is_callable
acepta cualquier cosa por la que pueda pasar call_user_func
y family, mientras que function_exists
solo le dice si existe una función determinada (no métodos, vea method_exists
para eso, ni cierres).
Dicho de otra manera, is_callable
es un contenedor para zend_is_callable
, que maneja variables con la devolución de llamada de pseudo tipo, mientras que function_exists
solo realiza una búsqueda de tabla hash en la tabla de funciones.
Si existe una función Plop
, function_exists("Plop")
devolverá verdadero.
Ver function_exists
Si una variable es llamable, is_callable($var)
devolverá true.
Ahora, esto podría significar que $var
es un nombre de función.
Pero también podría ser un combo de nombre de objeto y método.
Ver is_callable
Una más diferente:
Si tiene una clase que usa el método mágico __call
, el método is_callable($object, $method)
siempre devolverá verdadero para cualquier cosa porque __call
básicamente acepta todos los nombres de métodos. Y como ya sabrá, method_exists
devolverá false para esto si el método no está definido en la clase.
Esto es especialmente molesto si usas la clase Model
CakePHP cuando implementaron el método mágico __call
para proporcionar consultas mágicas, pero no está bien si quieres que el método esté completamente definido.