使用する際call_user_func_array()
にパラメータを参照渡ししたい。どうすればこれを行うことができますか。例えば
function toBeCalled( &$parameter ) {
//...Do Something...
}
$changingVar = 'passThis';
$parameters = array( $changingVar );
call_user_func_array( 'toBeCalled', $parameters );
を使用して参照渡しするcall_user_func_array()
には、配列内のパラメータが参照である必要があります。参照渡しであるかどうかは、関数定義には依存しません。たとえば、これは機能します。
function toBeCalled( &$parameter ) {
//...Do Something...
}
$changingVar = 'passThis';
$parameters = array( &$changingVar );
call_user_func_array( 'toBeCalled', $parameters );
詳細については、call_user_func_array()
関数ドキュメントの注意事項を参照してください。
直接的には不可能かもしれませんが、実装している関数とそれを呼び出すコードの両方を制御できる場合は、適切な回避策が 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 のオブジェクト変数はオブジェクトの内容への参照にすぎません。つまり、オブジェクトを関数に渡すと、関数がオブジェクトの内容に加えた変更は、呼び出し元に反映されます。 function にもアクセスできます。
呼び出し元の関数がオブジェクト変数自体への代入を決して行わないことを確認してください。そうしないと、基本的に、関数が参照を失います。関数が作成する割り当てステートメントは、オブジェクトの内容に厳密でなければなりません。
ここで非推奨の機能を使用していることを除いて。PHP5 で警告が生成され、完璧とは言えなくなります。
警告: 呼び出し時の参照渡しは廃止されました。参照渡しにしたい場合は、実行時関数名の宣言を変更してください。呼び出し時の参照渡しを有効にしたい場合は、INI ファイルで allow_call_time_pass_reference を true に設定できます...
残念ながら、私が発見できる限り、他のオプションはないようです。