94

phpの無名関数について読んだことにとても興奮しました。これにより、 create_functionを使用するよりも関数が簡単な変数を宣言できます。変数が渡される関数があるかどうか疑問に思っていますが、それをチェックして関数かどうかを判断するにはどうすればよいですか?is_function()関数はまだありません。関数である変数のvar_dumpを実行すると、次のようになります。

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

私はこれを手に入れます:

object(Closure)#8 (0) { } 

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

4

5 に答える 5

150

is_callable特定の変数が関数であるかどうかを判別するために使用します。例えば:

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

if( is_callable( $func ) )
{
    // Will be true.
}
于 2010-05-14T16:09:04.633 に答える
35

function_exists指定した名前の関数があるかどうかを確認するために使用できます。そしてそれを無名関数と組み合わせるには、これを試してください:

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}
于 2010-05-14T16:05:02.057 に答える
31

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

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

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

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

PHPには、おそらく関数と見なすことができる別の種類のものがあります。それは、__invoke魔法のメソッドを実装するオブジェクトです。それらを(文字列と配列を除外しながら)含める場合は、を使用しますmethod_exists($func, '__invoke')__invokeクロージャは一貫性を保つために実装されるため、これには引き続きクロージャが含まれます。

于 2014-12-12T23:50:06.187 に答える
2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}
于 2017-09-27T12:03:27.333 に答える
0

PHPでは、有効な呼び出し可能オブジェクトは、関数、関数の名前(文字列)、およびフォームの配列['className', 'staticMethod']または[$object, 'method']である可能性があるため、関数のみを検出するには、文字列と配列を除外する必要があります。

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
于 2020-02-27T03:47:10.123 に答える