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_existspara 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 Closurees 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
Closureclase, y cada instancia de laClosureclase 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
__invokemé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__invokepara 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