Можно ли создать функцию PHP, которая принимает переменное количество параметров, все из них по ссылке?
Это не помогает мне функция, которая получает по ссылке массив значений или функцию, которая принимает свои аргументы, обернутые в объект, потому что я работаю над составлением функций и привязкой аргументов. Не думайте также о переходе по времени вызова. Эта вещь не должна существовать.
В PHP 5.6 представлен новый вариационный синтаксис, который поддерживает передачу по ссылке. (спасибо @outis за обновление)
function foo(&...$args) { $args[0] = 'bar'; }
Для PHP 5.5 или ниже вы можете использовать следующий трюк:
function foo(&$param0 = null, &$param1 = null, &$param2 = null, &$param3 = null, &$param4 = null, &$param5 = null) { $argc = func_num_args(); for ($i = 0; $i < $argc; $i++) { $name = 'param'.$i; $params[] = & $$name; } // do something }
Недостатком является то, что количество аргументов ограничено количеством аргументов, определенных (6 в фрагменте примера). но с func_num_args () вы можете обнаружить, требуется ли больше.
Передача более 7 параметров функции – это плохая практика;)
В PHP 5.6 представлен новый вариационный синтаксис, который поддерживает передачу по ссылке. Префикс последнего параметра к функции с ...
объявляет ее как массив, который будет содержать любые фактические аргументы из этой точки. Массив может быть объявлен для хранения ссылок путем дальнейшего префикса ...
токена с символом &
, как это сделано для других параметров, эффективно делая аргументы pass-by-ref.
Пример 1:
function foo(&...$args) { $args[0] = 'bar'; } foo($a); echo $a, "\n"; # output: #a
Пример 2:
function number(&...$args) { foreach ($args as $k => &$v) { $v = $k; } } number($zero, $one, $two); echo "$zero, $one, $two\n"; # output: #0, 1, 2
Вы должны иметь возможность передать все ваши параметры, завернутые в объект.
Class A { public $var = 1; } function f($a) { $a->var = 2; } $o = new A; printf("\$o->var: %s\n", $o->var); f($o); printf("\$o->var: %s\n", $o->var);
следует распечатать 1 2
Редактировать: извините, я не видел, чтобы вы хотели, чтобы они были ссылками … все, что вам нужно сделать, это передать их как объект.
Вы также можете передать их в массиве, например
myfunction(array('var1' => 'value1', 'var2' => 'value2'));
то в функции вы просто
myfunction ($arguments) { echo $arguments['var1']; echo $arguments['var2']; }
Массивы также могут быть вложенными.
Возможно:
$test = 'foo'; $test2 = 'bar'; function test(){ $backtrace = debug_backtrace(); foreach($backtrace[0]['args'] as &$arg) $arg .= 'baz'; } test(&$test, &$test2);
Однако для этого используется время вызова по ссылке, которое устарело.