PHP: список аргументов переменной длины по ссылке?

можно ли создать функцию PHP, которая принимает переменное количество параметров все из них по ссылке?

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

5 ответов


в PHP 5.6 введен новый вариационный синтаксис который поддерживает pass-by-reference. (спасибо @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-reference. Префикс последнего параметра функции с помощью ... объявляет его как массив, который будет содержать любые фактические аргументы с этого момента. Массив может быть объявлен для хранения ссылок путем дальнейшего префикса ... маркер &, как это делается для других параметров, эффективно делая аргументы 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);

надо напечатать Один 2


Edit: извините, я не видел, что вы хотели, чтобы они были ссылками....все, что вам нужно сделать, это передать их как объект.

вы также можете передать их в массив, например

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);

однако это использует передачу времени вызова по ссылке, которая устарела.