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