16

return匿名関数を引数として渡してすぐに実行し、関数の値を渡すことは可能ですか?

function myFunction(Array $data){
    print_r($data);
}

myFunction(function(){
    $data = array(
        'fruit'     => 'apple',
        'vegetable' => 'broccoli',
        'other'     => 'canned soup');
    return $data;
});

これは、Arrayタイプヒントが原因でエラーをスローし、オブジェクトが渡されたことを訴えます。さて、タイプヒントを削除すると、もちろんClosure Object、希望する結果ではなく、吐き出されます。私は技術的にのオブジェクトインスタンスをに渡していることを理解していますがClosuremyFunctionこれが他の場所で達成されているのを見たことはほぼ確実です。これは可能ですか?もしそうなら、私は何を間違っていますか?

この議論のために、クロージャーを渡す関数を変更することはできません。

tl; dr:匿名関数宣言を引数として渡して、戻り値を引数として渡すにはどうすればよいですか。

PS:明確でない場合、望ましい出力は次のとおりです。

Array
(
    [fruit] => apple
    [vegetable] => broccoli
    [other] => canned soup
)
4

3 に答える 3

12

できません。最初にそれを呼び出す必要があります。また、PHPはクロージャの参照解除をまだサポートしていないため、最初に変数に格納する必要があります。

$f = function(){
    $data = array(
        'fruit'     => 'apple',
        'vegetable' => 'broccoli',
        'other'     => 'canned soup');
    return $data;
};
myfunction($f());
于 2010-11-16T21:47:51.543 に答える
11

最近、私は同様の問題を解決していたので、期待どおりに機能するコードを投稿しています。

$test_funkce = function ($value) 
{

    return ($value + 10);
};


function Volej($funkce, $hodnota)
{   

   return $funkce->__invoke($hodnota);
   //or alternative syntax
   return call_user_func($funkce, $hodnota); 

}

echo Volej($test_funkce,10); //prints 20

それが役に立てば幸い。最初にクロージャーを作成し、次にクロージャーと引数を受け入れ、その内部を呼び出してその値を返す関数を作成しています。簡単に言えば。

PS:この回答のおかげで回答: 回答

于 2015-04-27T21:31:26.277 に答える
5

お気づきの結果ではなく、関数自体を渡しています。次のようなことをすぐに実行して、その関数を実行する必要があります。

myFunction((function() {
    return ...;
})(), $otherArgs);

PHPはそのようなことをサポートしていないので、その関数をいくつかの変数に割り当てて実行する必要があります。

$func = function() { ... };
myFunction($func(), $otherArgs);
于 2010-11-16T21:52:38.250 に答える