Estaba muy emocionado de leer sobre las funciones anónimas en php, que te permiten declarar una variable que funciona más fácilmente de lo que podrías hacer 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 es una función? Todavía no hay una función is_function (), y cuando hago un var_dump de una variable que es una función:
$func = function(){
echo 'asdf';
};
var_dump($func);
Entiendo esto:
object(Closure)#8 (0) { }
¿Alguna idea sobre cómo comprobar si se trata de una función?
php
anonymous-function
Jage
fuente
fuente
Puede utilizar
function_exists
para comprobar que existe una función con el nombre de pila. 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)); }
fuente
is_object()
¡yinstanceof Closure
es una forma mucho más sólida de comprobarlo!Si solo desea verificar si una variable es una función anónima y no una cadena o matriz invocable, use
instanceof
.$func = function() { echo 'asdf'; }; if($func instanceof Closure) { // Will be true. }
Las funciones anónimas (del tipo que se agregaron en PHP 5.3) son siempre instancias de la
Closure
clase, y cada instancia de laClosure
clase es una función anónima.Hay otro tipo de cosas en PHP que posiblemente podrían considerarse una función, y son los objetos que implementan el
__invoke
método mágico. Si desea incluirlos (sin dejar de excluir cadenas y matrices), usemethod_exists($func, '__invoke')
. Esto todavía incluirá cierres, ya que los cierres se implementan__invoke
para mantener la coherencia.fuente
is_callable()
intentará encontrar un método para llamar basado en una cadena o matriz pasada, que puede cargar clases automáticamente y puede que no sea el comportamiento que espera / requiere.function is_function($f) { return is_callable($f) && !is_string($f); }
fuente
En php, los invocables válidos pueden ser funciones, nombre de funciones (cadenas) y matrices de las formas
['className', 'staticMethod']
o[$object, 'method']
, por lo tanto, para detectar solo las funciones necesitan excluir cadenas y matrices:function isFunction($callable) { return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable); }
fuente