2013-04-07 20 views
13

更新:はPHP7から始めて、それが構文を使用してデリファレンス無名関数を使用できるようになりました:匿名関数の戻り値

$array[] = [ 
    'new' => (function() 
    { 
     ... 
     return mt_rand(); 
    })(), 

    'or' => getClosure()() 
] 

オリジナルのポスト:私は最近、いくつかのことを試してきました、匿名関数の戻り値を使う方法があるのだろうかと疑問に思った。

私はforループを使って配列の各値にデータベース呼び出しあります:

for($i = 0; $i != 10; $i++) 
{ 
    $array[] = [ 
     'new' => function(){ 
      // some proccesing here maybe 
      // lets use mt_rand for this example. 
      return mt_rand(); 
     }, 

     'old' => function(){ 
      return mt_rand(); 
     } 
    ]; 
} 

または多分

echo function(){ 
    // again, we'll just use mt_rand 
    return mt_rand(); 
}; 

は、これらの両方closureクラスを返します。上の例では、実際に戻り値を配列やエコーに戻す方法はありますか?

アップデート:私はこれがそうできません確立してきた、機能要求は、ここで見つけることができます:http://bugs.php.net/bug.php?id=64608

+0

はあなたが本当に匿名関数が必要ですか?普通のものが必要で、ループの中で呼び出すように聞こえます。 – kero

+0

あなたはどのPHPバージョンに依存していますか?php 5.4ではこれが可能かもしれませんが、古いパッケージ(つまり、Debian Squeeze私はPHP 5.3を実行することを知っている)はしません。 –

+0

@ JulianH.Lam私のサンプルはPHP 5.4.13でテストされました –

答えて

18

日付するための最も簡単な回避策:

echo call_user_func(function() { return 'foo'; }); 
+1

匿名関数逆参照がPHP7で利用可能になりました! –

1

は、変数に匿名functionを割り当てる試してみてください。

$myFunc = function() { 
    return 'Test'; 
} 

echo $myFunc(); // Outputs Test 

値自体は戻り値ではありません。戻り値は、関数がcalledのときに関数が返す値です。

編集:decezeによって示唆されるように

、あなたはcall_user_func()を使用することができます。あなたが望むものを達成するためのもう1つの方法は、PHPのeval()を使用することです。これは決して良いコーディング手法ではありません。

$array[] = array(
    'new' => call_user_func(function() { 
    // some proccesing here maybe 
    // lets use mt_rand for this example. 
    return mt_rand(); 
    }), 
    'old' => call_user_func(function() { 
    return mt_rand(); 
    }), 
); 

eval()

echo eval('$x = function() { 
    // some proccesing here maybe 
    // lets use mt_rand for this example. 
    return mt_rand(); 
}; return $x();'); 
+0

私はOPが '$ myFunc()'ではなく '$ myFunc'にアクセスするときに返される値を探していると思います。 –

+0

@TimCooperいいえ、関数呼び出しが必要です。http://codepad.viper-7.com/3nnjGW – Sam

+0

@Sam:戻り値を取得する関数を評価する必要があることは承知していますが、私は信じていますこれはあなたが評価を行う場所に関する質問です。 OPは、無名関数が定義されたときに評価されることを望んでいると私は思う。 –

0

あなたはVARに機能を割り当てる必要があり、look here

この作品

for($i = 0; $i != 10; $i++) 
{ 
$array[] = [ 
    'new' => function(){ 
     // some proccesing here maybe 
     // lets use mt_rand for this example. 
     return mt_rand(); 
    }, 

    'old' => function(){ 
     return mt_rand(); 
    } 
]; 
} 
echo $array[5]['new'](); 

または

$function = function(){ 
// again, we'll just use mt_rand 
return mt_rand(); 
}; 

echo $function(); 
+1

私の場合は、バットから直ちにリターンが必要です。 '$ a = function(){return mt_rand(); }(); 'は動作しません。 –

+0

それは譲渡であるため、$ a()を行うことができますが、何が問題なのですか? – Sam

1

クロージャは、それが逆参照することができます前に割り当てる必要が持っているように見えます - コードの下に、これを試してみてください:

for($i = 0; $i != 10; $i++) 
{ 
    $array[] = [ 
    'new' => call_user_func(function(){ 
     // some proccesing here maybe 
     // lets use mt_rand for this example. 
     return mt_rand(); 
    }), 

    'old' => call_user_func(function(){ 
     return mt_rand(); 
    }) 
    ]; 
} 

[編集] - call_user_funcを使用するように変更()の代わりにカスタム関数の - DOH!