PHPで変数がクロージャかどうかを判断する方法

結論としては・・・・?
PHP
3
Hidenori Goto | COO and CTO at KabuK Style @hidenorigoto

PHPで変数がクロージャかどうかを判定する良い方法をご存知の方、教えてください!

2011-02-10 10:12:28
heavenshell @heavenshell

@hidenorigoto if ($func instanceof Closure) {} とか?

2011-02-10 10:15:50
田中ひさてる @tanakahisateru

@hidenorigoto もしかして、function_exists($closure) ってどうですか。試してないですが、いけそうな気はするんですが...

2011-02-10 10:15:55
どぅーあき @do_aki

@hidenorigoto is_object($closure) && function_exists($closure, '__invoke') ってやってるけど、あまりスマートじゃないなぁとか。

2011-02-10 10:16:11
clairvy @clairvy

@hidenorigoto http://bit.ly/hp9gX4 へー.Closure は実装の名前だから使うなか.なるほど.

2011-02-10 10:20:01
どぅーあき @do_aki

@hidenorigoto method_exists ですね。間違えました^^;

2011-02-10 10:20:29
どぅーあき @do_aki

@hidenorigoto ちなみに、 function_exists($closure) は warning になります。 string しか許容してないので。

2011-02-10 10:23:20
うえちょこ🐤🔤 @uechoco

@heavenshell @hidenorigoto 先に言われてしまった orz http://ow.ly/3TAR4 「クロージャは、変数の値として使用することもできます。 PHP は、そのような記述があると自動的に内部クラス Closure のインスタンスに変換します。」

2011-02-10 10:23:42
Hidenori Goto | COO and CTO at KabuK Style @hidenorigoto

@uechoco Closureというクラス名を使ってはいかん、的なことがそのページに書いてあるのです。(そういう意図なのかどうか、正直分かりませんが。。。。)

2011-02-10 10:25:49
clairvy @clairvy

function f($o){return is_object($o) && is_callable($o);} という判定を考えたけど,create_function で作ったのはオブジェクトじゃないんや.

2011-02-10 10:30:22
clairvy @clairvy

まぁ,closure じゃないからいいか.

2011-02-10 10:30:55
うえちょこ🐤🔤 @uechoco

@hidenorigoto なるほどー暫定的にクラスで実装してるけど、内部名だから気をつけてっていことですね。そうならばis_closure_function()みたいな関数を提供して欲しいですね。

2011-02-10 10:31:03
heavenshell @heavenshell

@hidenorigoto 以前書いたコードみてみたら is_callable だけで判定してました。

2011-02-10 10:31:22
clairvy @clairvy

@hidenorigoto function_exists こそ実装依存な気が.それやったら is_object($o) && is_callable($o) の方がまだいいような気はする.ちゃんと動くか知らないけど.

2011-02-10 10:32:37
どぅーあき @do_aki

@hidenorigoto __invoke メソッドを実装したクラス(Closure 継承でない) もクロージャ呼び出し可能だからじゃないでしょうか?

2011-02-10 10:32:58
clairvy @clairvy

ということで,ソースをサーチする流れ?

2011-02-10 10:35:49
clairvy @clairvy

そもそも,__invoke メソッドがあるオブジェクトやったら,closure じゃなくてもいいのか?という.いあ違いがわからんけど.なので違いがあるか読む流れかなぁ?と思ったりした.

2011-02-10 10:38:23
どぅーあき @do_aki

ぁ、たしかに is_object($closure) && is_callable($closure) でもいいのか。

2011-02-10 10:38:38
Hidenori Goto | COO and CTO at KabuK Style @hidenorigoto

Symfony2のコードだと、「is_object($listener) && $listener instanceof \Closure」となってました。悩ましいですね・・・。 #php

2011-02-10 10:40:55
どぅーあき @do_aki

どうも、 is_callable はあまり使いたくないのよね。 オブジェクト (or array) かどうかの判定もしないと、 "phpinfo" とか実行しちゃう可能性があるし。

2011-02-10 10:41:02
clairvy @clairvy

たまたま手元にあった,5.3.3 を見たけど,引数が IS_OBJECT やったら __invoke とかを見てくれたりしてるみたい(超テキトウ読み).なんで動作は似てる.function_exists よりis_callable のが抽象化されてる気はする.

2011-02-10 10:47:13
clairvy @clairvy

instancef Closure と function_exists(, "__invoke") とどう違うねん.という話かな.

2011-02-10 10:48:03
clairvy @clairvy

ここで,Callableインターフェイスとして,__invoke が定義してあるなら話は違うんだけどな.とあいえ,そうなるとそもそも instanceof Callable にすればいいけど,それはClosure ですか?みたいな.

2011-02-10 10:50:02