web-dev-qa-db-ja.com

php is_function()は、変数が関数かどうかを判断します

PHPの 匿名関数 について読むのがとても楽しみでした。これにより、 create_function でできるよりも簡単な関数の変数を宣言できます。今、私は変数を渡される関数があるのだろうか、それが関数であるかどうかを判断するためにどのように確認できますか? is_function()関数はまだありません。関数である変数のvar_dumpを実行すると::

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

私はこれを得る:

object(Closure)#8 (0) { } 

これが機能であるかどうかを確認する方法についての考えはありますか?

81
Jage

つかいます - is_callable は、指定された変数が関数かどうかを判断します。例えば:

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

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

function_exists 指定された名前の関数があることを確認します。そして、それを匿名関数と組み合わせるには、これを試してください:

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

変数が匿名関数であり、呼び出し可能な文字列または配列ではないかどうかのみを確認する場合は、instanceofを使用します。

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

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

(PHP 5.3)で追加された種類の)匿名関数は常にClosureクラスのインスタンスであり、Closureクラスのすべてのインスタンスは匿名です関数。

PHPにはおそらく間違いなく関数と見なされる可能性のある別のタイプのものがあり、それは__invoke魔法のメソッドを実装するオブジェクトです。配列)、method_exists($func, '__invoke')を使用します。一貫性のためにクロージャーは__invokeを実装するため、これにはクロージャーが含まれます。

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