Closureって呼ぶな!(PHP5.3 無名関数)

PHP: 無名関数 - Manual

"無名関数は、現在は Closure クラスで実装されています。 これはあくまでも内部実装の問題であり、この事実に依存したコードを書いてはいけません。 " http://bit.ly/eHO3AyWed Feb 02 00:25:56 via Echofon

function ( Closure $func ) {} とかはそれっぽく動作するけど,それはヤメレってことやね.Wed Feb 02 00:26:16 via Echofon

うーむ,動くけどダメっていうパターン.

サンプルコード

$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の本来の用法じゃないだろうか.