Можно ли передать параметры по ссылке с помощью call_user_func_array ()? - PullRequest
43 голосов
/ 17 ноября 2008

При использовании call_user_func_array() я хочу передать параметр по ссылке. Как бы я это сделал? Например

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

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

Ответы [ 4 ]

51 голосов
/ 17 ноября 2008

Чтобы передать по ссылке, используя 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 голос
/ 12 августа 2015

Непосредственно, это может быть невозможно - однако, если у вас есть контроль как над функцией, которую вы реализуете , так и кода, который вызывает это - тогда есть один рабочий вокруг этого вы могли бы найти подходящий.

Вы бы согласились с тем, чтобы встроить указанную переменную в объект? Код выглядел бы (несколько) так, если бы вы это сделали.

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 - это просто ссылка на содержимое объекта - так что если вы передаете объект в функцию, любые изменения, которые Функция заставляет содержимое объекта отражаться в том, к чему имеет доступ и вызывающая функция.

Просто убедитесь, что вызывающая функция никогда не выполняет присваивание переменной объекта самой - или это приведет к тому, что функция, в основном, потеряет ссылку. Любой оператор присваивания, который делает функция, должен быть строго для содержимого объекта.

0 голосов
/ 08 февраля 2017

Это работает при двойной ссылке, исходная переменная изменяется при изменении переменной $ parameter.

$a = 2;
$a = toBeCalled($a);
echo $a //50

function toBeCalled( &$par_ref ) {
    $parameter = &$par_ref;
    $parameter = $parameter*25;
}
0 голосов
/ 08 сентября 2009

За исключением того, что вы используете устаревшую функциональность здесь. Вы создадите предупреждение в PHP5, сделав его не идеальным.

Предупреждение: передача по времени вызова устарела; Если вы хотите передать его по ссылке, измените объявление имени функции времени выполнения. Если вы хотите включить функцию передачи по вызову во время вызова, вы можете установить для параметра allow_call_time_pass_reference значение true в файле INI в ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...