2010-08-17 11 views
40

Estoy trabajando en un proyecto, en el que estoy usando alguna función en desuso de la versión anterior. Pero no quiero que se detenga mi script si se usa en la versión anterior. Así que estoy comprobando si la función existe y si no la está creando nuevamente.¿Cuál es exactamente la diferencia entre is_callable y function_exists en PHP?

¿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 
    } 
} 

Respuesta

45

La función is_callable acepta no sólo los nombres de función, sino también otros tipos de callbacks:

  • Foo::method
  • array("Foo", "method")
  • array($obj, "method")
  • Los cierres y otros objetos invocable (PHP 5.3)

Así is_callable acepta cualquier cosa que usted podría pasar call_user_func y la familia, mientras que function_exists sólo dice si una determinada función (no existe métodos, consulte method_exists para eso, ni los cierres).

Dicho de otra manera, is_callable es un contenedor de zend_is_callable, que maneja las variables con la devolución de llamada de tipo seudo, mientras que sólo un function_existshash table lookup en la tabla de funciones.

+0

Gracias esto ayudó mucho ... –

2

Si existe una función Plop continuación function_exists("Plop") devolverá true.

Ver function_exists

Si una variable es exigible a continuación 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

8

Cuando se usa con una función (no es 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 puede usar function_exists. Tendrá que usar is_callable o method_exists.

7

Cuando se utiliza en el contexto de clase, is_callable devuelve verdadero para los métodos de clase que son accesibles, es decir, los métodos públicos, pero method_exists devuelve verdadero para todos los métodos: público, protegido y privado. function_exists hace lo mismo que method_exists fuera de contextos de clase.

0

Uno más diferentes:

Si usted tiene una clase que utiliza __call magic method, la is_callable($object, $method) siempre devolverá cierto para nada porque __call básicamente acepta cada nombre del método. Y como ya sabrá, method_exists devolverá falso para esto si el método no está definido en la clase.

Esto es especialmente molesto si usa la clase CakePHP Model ya que implementaron el método mágico __call para proporcionar consultas mágicas, pero no son interesantes si quiere que el método esté absolutamente definido.

Cuestiones relacionadas