web-dev-qa-db-ja.com

call_user_func_array()を使用して参照によってパラメーターを渡すことは可能ですか?

call_user_func_array()を使用する場合、参照によってパラメーターを渡したい。どうすればいいですか。例えば

function toBeCalled( &$parameter ) {
    //...Do Something...
}

$changingVar = 'passThis';
$parameters = array( $changingVar );
call_user_func_array( 'toBeCalled', $parameters );
45
Steven Oxley

call_user_func_array()を使用して参照渡しするには、配列内のパラメーターが参照である必要があります。参照渡しであるかどうかは、関数定義に依存しません。たとえば、これは機能します。

_function toBeCalled( &$parameter ) {
    //...Do Something...
}

$changingVar = 'passThis';
$parameters = array( &$changingVar );
call_user_func_array( 'toBeCalled', $parameters );
_

詳細については、 call_user_func_array()関数のドキュメント に関する注記を参照してください。

53
Steven Oxley

直接、それは不可能かもしれません-しかし、あなたが実装している関数の両方を制御できる場合そしてそれを呼び出すコードの-そして1つの回避策がありますあなたがかもしれない適切だと思うこと。

問題の変数をオブジェクトに埋め込む必要がありますか?そうすると、コードは(やや)このようになります。

function toBeCalled( $par_ref ) {
    $parameter = $par_ref->parameter;
    //...Do Something...
    $par_ref->parameter = $parameter;
}

$changingVar = 'passThis';
$parembed = new stdClass; // Creates an empty object
$parembed->parameter = array( $changingVar );
call_user_func_array( 'toBeCalled', $parembed );

ご覧のとおり、PHPのオブジェクト変数は、オブジェクトのcontentsへの参照にすぎません---したがって、オブジェクトを渡すと関数に対して、オブジェクトのcontentに対して関数が行った変更は、呼び出し元の関数がアクセスできるものにも反映されます。

呼び出し元の関数がオブジェクト変数に割り当てを行わないことを確認してくださいそれ自体-または、基本的に、関数が参照を失うにします。関数が行う代入ステートメントは、オブジェクトの厳密にからコンテンツでなければなりません。

1
Sophia_ES