2010-05-14 26 views
70

Estaba muy emocionado de leer sobre anonymous functions en php, lo que le permite declarar que una variable que es función es más fácil que con create_function. Ahora me pregunto si tengo una función a la que se le pasa una variable, ¿cómo puedo verificarla para determinar si se trata de una función? No hay ninguna función is_function(), sin embargo, y cuando lo haga un var_dump de una variable que es función ::php is_function() para determinar si una variable es una función

$func = function(){ 
    echo 'asdf'; 
}; 
var_dump($func); 

me sale esto:

object(Closure)#8 (0) { } 

Alguna idea sobre cómo comprobar si esto es una función?

Respuesta

109

Uso is_callable para determinar si una variable dada es una función. Por ejemplo:

$func = function() 
{ 
    echo 'asdf'; 
}; 

if(is_callable($func)) 
{ 
    // Will be true. 
} 
+7

is_callable() funcionará bien si está pasando una función anónima, un nombre de función como una cadena o una matriz válida de devolución de llamada de PHP. Si específicamente desea verificar funciones anónimas solamente, entonces desearía algo como lo que dijo Gumbo: asegúrese de que el parámetro sea un objeto y asegúrese de que sea una instancia de Cierre. – Lane

+1

¿Qué pasa si quiero verificar si es un callack o una cuerda y hacer cosas diferentes para ellos? No quiero que un valor de cadena se tome accidentalmente como una devolución de llamada. – Gherman

+2

@German Simplemente marque primero si is_string ($ func) luego como segunda comprobación con is_callable ($ func) – Heroselohim

29

Puede usar function_exists para verificar que hay una función con el nombre dado. Y para combinar eso con funciones anónimas, intente esto:

function is_function($f) { 
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure)); 
} 
+0

¡Gracias por esto! Mi aplicación permite a los usuarios especificar su propia función hash o alternativamente proporcionar un argumento para hash(). Pero algunos de los algoritmos hash válidos también son builtins PHP, y por lo tanto invocables ('md5', 'sha1' por ejemplo). 'is_object()' y 'instanceof Closure' es una manera mucho más robusta de verificar esto. – njbair

+0

Elimine las llamadas is_string y function_exists y esta es la función que desea usar para detectar funciones lambda. ¡Gracias! – jack

17

Si sólo desea comprobar si una variable es una función anónima y no se puede llamar una cadena o una matriz, utilice instanceof.

$func = function() 
{ 
    echo 'asdf'; 
}; 

if($func instanceof Closure) 
{ 
    // Will be true. 
} 

funciones anónimas (del tipo que se añadieron en PHP 5.3) son siempre instancias de la clase Closure, y cada instancia de la clase Closure es una función anónima.

Hay otro tipo de cosa en PHP que podría considerarse una función, y son objetos que implementan el método mágico __invoke. Si desea incluirlos (sin excluir cadenas y matrices), use method_exists($func, '__invoke'). Esto todavía incluirá cierres, ya que los cierres implementan __invoke para mantener la coherencia.

+4

Esto es particularmente útil, porque 'is_callable()' intentará encontrar un método para llamar en función de una cadena o matriz pasada, lo que puede autocargar clases y puede no ser el comportamiento que espera/requiere. – spikyjt

0
function is_function($f) { 
    return is_callable($f) && !is_string($f); 
} 
Cuestiones relacionadas