Closureって呼ぶな!(PHP5.3 無名関数)
Posted: Updated:
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の本来の用法じゃないだろうか.