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