2016-05-20 16 views
7

私は、オブジェクトをインスタンス化し、そのメソッドを実行する以下の関数を持っています。私は$to_returnを返そうとしていますが、機能が 'use'キーワードを使用していても$to_returnは変更されません。ここでは関数は次のとおりです。オブジェクトインスタンスのPHPコールバックと関数の戻り値を待ちます

function some_function($arg){ 

    $to_return = false; 

    $object = new Object; 

    $to_return = $object->METHOD(function($callback) use ($to_return){ 

     $to_return = $some_var; 

    }); 

    $to_return = $object->runMETHOD("some_arg"); 

    return $to_return; 

} 

だから、基本的には:どのように私は作ることができます返さ

  • $to_returnはいつも私がsome_functionは要するに

$ some_varを返すようにしたい偽

  • ですsome_functionはオブジェクトメソッド内で変更されたオブジェクトを返しますか?

  • +0

    ちょうど$ thisをメソッドで返す – peter

    +0

    @PeterChaula申し訳ありません、どのくらい正確ですか?この状況に特有のものを教えてください。関数がオブジェクトのインスタンスではなく '$ some_var'を返すようにします。 – Fane

    +0

    クロージャ内の '$ to_return'プロパティを更新するには、参照渡しが必要です。すなわち、 'function(...)use(&$ to_return){...'。 –

    答えて

    3

    あなたが欠場すべてが$to_returnが参照によって渡されるべきであることを示している:

    function($callback) use (& $to_return) 
    

    また3v4l上の例の作業の例:https://3v4l.org/Vfp70

    私は内部の専門家だが、長い話を短くプリミティブがありますコールバックで設定したものが外部に転送されないため、どこかに渡したときに "コピーされました"。一方、オブジェクトは、オブジェクトへのポインタが渡され元のインスタンスが変更されるため、期待どおりに動作します。そのようなトランスポーターがうまくいくように、この3v4lに示すように、ごく単純なstdClassを使用する:https://3v4l.org/m9jJ3

    +0

    いいえ、これは機能しません...あなたが関数としてこれをやっているという違いがあり、私はオブジェクトメソッドとしてそれをやっていますか? – Fane

    +0

    いいえ、それでも動作するはずです:https://3v4l.org/mD5YDあなたのコードでは、少なくとも2つの場所で '$ to_return'を上書きしていますので、最後にその値に影響します – malarzm

    0

    は@malarzmによって与えられたソリューションを使用しますが、その後も$のto_returnに機能を割り当てない(それはとにかく何の結果を持っていない)

    ので、代わりの

    $to_return = $object->METHOD(function($callback) use ($to_return) 
    

    使用:また

    $object->METHOD(function($callback) use (&$to_return) 
    

    あなたは同じ変数beforを上書きしていますそれでもここで使用しています:

    $to_return = $object->runMETHOD("some_arg"); 
    

    おそらく、そのメソッドの戻り値を別の変数に割り当てることができます。

    関連する問題