Byłem bardzo podekscytowany czytaniem o anonimowych funkcjach w php, które pozwalają zadeklarować zmienną, która jest funkcją łatwiejszą niż w przypadku create_function . Teraz zastanawiam się, czy mam funkcję, której przekazano zmienną, jak mogę to sprawdzić, aby określić, czy jest to funkcja? Nie ma jeszcze funkcji is_function (), a kiedy wykonuję var_dump zmiennej, która jest funkcją:
$func = function(){
echo 'asdf';
};
var_dump($func);
Rozumiem:
object(Closure)#8 (0) { }
Jakieś przemyślenia, jak sprawdzić, czy to jest funkcja?
php
anonymous-function
Jage
źródło
źródło
Możesz użyć,
function_exists
aby sprawdzić, czy istnieje funkcja o podanej nazwie. Aby połączyć to z anonimowymi funkcjami, spróbuj tego:function is_function($f) { return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure)); }
źródło
is_object()
iinstanceof Closure
jest znacznie bardziej niezawodnym sposobem sprawdzenia tego!Jeśli chcesz tylko sprawdzić, czy zmienna jest funkcją anonimową, a nie ciągiem lub tablicą możliwą do wywołania, użyj
instanceof
.$func = function() { echo 'asdf'; }; if($func instanceof Closure) { // Will be true. }
Funkcje anonimowe (takie, jakie zostały dodane w PHP 5.3) są zawsze instancjami
Closure
klasy, a każda instancjaClosure
klasy jest funkcją anonimową.W PHP jest jeszcze jeden rodzaj rzeczy, które można by prawdopodobnie uznać za funkcję, a są to obiekty implementujące
__invoke
magiczną metodę. Jeśli chcesz je uwzględnić (jednocześnie wykluczając ciągi i tablice), użyjmethod_exists($func, '__invoke')
. Będzie to nadal obejmować zamknięcia, ponieważ zamknięcia są wdrażane w__invoke
celu zachowania spójności.źródło
is_callable()
spróbuje znaleźć metodę do wywołania na podstawie przekazanego ciągu lub tablicy, która może automatycznie ładować klasy i może nie być zachowaniem, którego oczekujesz / wymagasz.function is_function($f) { return is_callable($f) && !is_string($f); }
źródło
W php poprawnymi wywoływanymi mogą być funkcje, nazwy funkcji (ciągi znaków) i tablice formularzy
['className', 'staticMethod']
lub[$object, 'method']
, aby wykryć tylko funkcje, należy wykluczyć ciągi i tablice:function isFunction($callable) { return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable); }
źródło