Можно ли передавать параметры по ссылке с помощью call_user_func_array()?
При использовании call_user_func_array()
я хочу передать параметр по ссылке. Как бы я это сделал. Например
function toBeCalled( &$parameter ) {
//...Do Something...
}
$changingVar = 'passThis';
$parameters = array( $changingVar );
call_user_func_array( 'toBeCalled', $parameters );
Ответы
Ответ 1
Для передачи по ссылке с помощью call_user_func_array()
параметр в массиве должен быть ссылкой - он не зависит от определения функции, передается ли он по ссылке. Например, это будет работать:
function toBeCalled( &$parameter ) {
//...Do Something...
}
$changingVar = 'passThis';
$parameters = array( &$changingVar );
call_user_func_array( 'toBeCalled', $parameters );
Подробнее см. примечания к call_user_func_array()
документации по функциям.
Ответ 2
Непосредственно, это может быть невозможно - однако, если у вас есть контроль как над выполняемой вами функцией, так и с кодом, который ее вызывает, - тогда есть одна рабочая задача, которую вы можете найти подходящей.
Не могли бы вы включить встроенную переменную в объект? Код выглядел бы (несколько), как если бы вы это сделали.
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 является просто ссылкой на содержимое объекта --- поэтому, если вы передаете объект функции, любые изменения, которые функция делает для содержимого объекта, будут отражены в к которым также имеет доступ вызывающая функция.
Просто убедитесь, что вызывающая функция никогда не выполняет привязку к самой переменной объекта - или это приведет к тому, что функция перестанет ссылаться. Любой оператор присваивания, который выполняет функция, должен строго соответствовать содержимому объекта.
Ответ 3
Это работает с помощью двойной ссылки, исходная переменная изменяется при изменении переменной параметра $.
$a = 2;
$a = toBeCalled($a);
echo $a //50
function toBeCalled( &$par_ref ) {
$parameter = &$par_ref;
$parameter = $parameter*25;
}
Ответ 4
Кроме того, вы используете устаревшие функции. Вы создадите предупреждение в PHP5, сделав его менее совершенным.
Предупреждение: время прохода по ссылке устарело; Если вы хотите передать его по ссылке, измените объявление имени функции выполнения. Если вы хотите включить call-by-reference call-time, вы можете установить allow_call_time_pass_reference в true в вашем INI файле в...
К сожалению, по-видимому, нет какой-либо другой опции, насколько я могу обнаружить.