Я был очень взволнован, прочитав об анонимных функциях в php, которые позволяют вам объявлять переменную, которая является функцией, проще, чем вы могли бы сделать с помощью create_function . Теперь мне интересно, есть ли у меня функция, которой передается переменная, как я могу проверить ее, чтобы определить, является ли это функцией? Еще нет функции is_function (), и когда я делаю var_dump переменной, которая является функцией ::
$func = function(){
echo 'asdf';
};
var_dump($func);
Я получаю это:
object(Closure)#8 (0) { }
Есть мысли о том, как проверить, является ли это функцией?
Вы можете использовать,
function_exists
чтобы проверить, есть ли функция с заданным именем. И чтобы совместить это с анонимными функциями, попробуйте следующее:function is_function($f) { return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure)); }
источник
is_object()
иinstanceof Closure
это гораздо более надежный способ проверить это!Если вы хотите только проверить, является ли переменная анонимной функцией, а не вызываемой строкой или массивом, используйте
instanceof
.$func = function() { echo 'asdf'; }; if($func instanceof Closure) { // Will be true. }
Анонимные функции (того типа, который был добавлен в PHP 5.3) всегда являются экземплярами
Closure
класса, и каждый экземплярClosure
класса является анонимной функцией.В PHP есть еще один тип вещей, которые можно было бы рассматривать как функцию, и это объекты, реализующие
__invoke
магический метод. Если вы хотите включить их (исключая строки и массивы), используйтеmethod_exists($func, '__invoke')
. Это по-прежнему будет включать в себя замыкания, поскольку замыкания реализованы__invoke
для согласованности.источник
is_callable()
будет пытаться найти метод для вызова на основе переданной строки или массива, который может автоматически загружать классы и может не соответствовать ожидаемому / требуемому поведению.function is_function($f) { return is_callable($f) && !is_string($f); }
источник
В php допустимыми вызываемыми объектами могут быть функции, имена функций (строки) и массивы форм
['className', 'staticMethod']
или[$object, 'method']
, поэтому для обнаружения только функций необходимо исключить строки и массивы:function isFunction($callable) { return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable); }
источник