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


88

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

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

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

object(Closure)#8 (0) { } 

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

回答:


139

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

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

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

10
is_callable()は、無名関数、関数名を文字列として渡す場合、または有効なPHPコールバック配列を渡す場合に、うまく機能します。特に無名関数のみをチェックしたい場合は、Gumboが言ったようなものが必要です。パラメーターがオブジェクトであることを確認し、それがClosureのインスタンスであることを確認してください。
レーン

2
それがカラックであるか文字列であるかを確認し、それらのために異なることをしたい場合はどうなりますか?文字列値が誤ってコールバックとして取得されたくありません。
ガーマン2014

2
@ドイツ語is_string($ func)の場合は最初にチェックし、次にis_callable($ func)の2番目のチェックとして
ヒーローセロヒム

4
上記のコードスニペットで問題が発生しました。「Date」というラベルの付いた文字列を意図し、それをクロージャーとして処理して実行しました。正しい方法は次のとおりです((($ variable instanceof Closure)&& is_callable($ variable)){...}
Basil Musa

1
クロージャーANDのインスタンスが呼び出し可能である理由。クロージャはいつ呼び出し不可能ですか?時間があったとしても驚かないでしょうが、両方のチェックが必要なのはなぜでしょうか。
ジョエルM

34

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

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

これをありがとう!私のアプリでは、ユーザーが独自のハッシュ関数を指定したり、hash()の引数を指定したりできます。ただし、有効なハッシュアルゴリズムの一部はPHPの組み込み関数であるため、呼び出し可能です(たとえば、「md5」、「sha1」)。is_object()そしてinstanceof Closure、このためにチェックするはるかに堅牢な方法です!
njbair

is_stringおよびfunction_exists呼び出しを削除します。これはラムダ関数を検出するために使用する関数です。ありがとうございました!
ジャック

28

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

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

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

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

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


8
は、is_callable()渡された文字列または配列に基づいて呼び出すメソッドを見つけようとするため、これは特に役立ちます。これは、クラスを自動ロードする可能性があり、期待する/必要としない動作になる可能性があります。
spikyjt 2015

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

将来、PHPはgettype()をObjectからCallableに変更する可能性があります。したがって、この答えはおそらく最善の方法です。しかし、これは次のように最適化できます:return!is_string($ f)&&!is_array($ f)&& is_callable($ f)。
Alexandre T.

0

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

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.