Можно ли передавать параметры по ссылке с помощью 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 файле в...

К сожалению, по-видимому, нет какой-либо другой опции, насколько я могу обнаружить.