Подтвердить что ты не робот

Php is_function(), чтобы определить, является ли переменная функцией

Мне было очень приятно читать анонимные функции в php, которые позволяют вам объявлять переменную, которая является функцией легче, чем вы могли бы сделать с create_function. Теперь мне интересно, есть ли у меня функция, которая передается переменной, как я могу проверить ее, чтобы определить, является ли она функцией? Функция is_function() еще не существует, и когда я делаю var_dump переменной, которая является функцией::

$func = function(){
    echo 'asdf';
};
var_dump($func);

Я получаю это:

object(Closure)#8 (0) { } 

Любые мысли о том, как проверить, является ли это функцией?

4b9b3361

Ответ 1

Используйте is_callable, чтобы определить, является ли данная переменная функцией. Например:

$func = function()
{  
    echo 'asdf';  
};

if( is_callable( $func ) )
{
    // Will be true.
}

Ответ 2

Вы можете использовать function_exists, чтобы проверить, есть ли функция с заданным именем. И чтобы объединить это с анонимными функциями, попробуйте следующее:

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}

Ответ 3

Если вы хотите проверить, является ли переменная анонимной функцией, а не вызываемой строкой или массивом, используйте instanceof.

$func = function()
{  
    echo 'asdf';  
};

if($func instanceof Closure)
{
    // Will be true.
}

Анонимные функции (такие, которые были добавлены в PHP 5.3) всегда являются экземплярами класса Closure, и каждый экземпляр класса Closure является анонимной функцией.

В PHP есть еще один тип вещей, который можно считать функцией, и те объекты, которые реализуют магический метод __invoke. Если вы хотите включить их (в то же время исключая строки и массивы), используйте method_exists($func, '__invoke'). Это все равно будет включать замыкания, так как замыкания реализуют __invoke для согласованности.

Ответ 4

function is_function($f) {
    return is_callable($f) && !is_string($f);
}