PHP: 無名関数 - Manual
"無名関数は、現在は Closure クラスで実装されています。 これはあくまでも内部実装の問題であり、この事実に依存したコードを書いてはいけません。 " http://bit.ly/eHO3Ay
function ( Closure $func ) {} とかはそれっぽく動作するけど,それはヤメレってことやね.
うーむ,動くけどダメっていうパターン.
サンプルコード
$Hoge = new Hoge(); $Hoge->hogehoge(function() { return 'hogehoge'; }); class Hoge { public function hogehoge(Closure $func) { echo $func(); // 'hogehoge' } }
上記のようなコードで引数の型っぽく指定できるが,Closureというクラス名に依存すんな,ってことなので実際にはNG.
if ( $func instanceof Closure ) { echo 'this is Closure.'; }
これも同様にNGな書き方といえる.んじゃOKな書き方は?というと.
if ( is_callable($func) ) { echo 'this is callable function.'; }
で,よいだろう.ただし,is_callableは下記のような場合でもtrueになるので注意.
if ( is_callable(array($obj, 'methodName')) ) { echo 'this is callable.'; }
各種のcallbackとして指定するときのアレ.むしろ,こちらがis_callableの本来の用法じゃないだろうか.