Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

В 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 параметров функции - это плохая практика;)

Ответ 2

В 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

Ответ 3

Вы должны иметь возможность передать все ваши параметры, завернутые в объект.


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

Ответ 4

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

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

myfunction(array('var1' => 'value1', 'var2' => 'value2'));

то в функции вы просто

myfunction ($arguments) {

echo $arguments['var1'];
echo $arguments['var2'];

}

Массивы также могут быть вложенными.

Ответ 5

Возможно:

$test = 'foo';
$test2 = 'bar';

function test(){
    $backtrace = debug_backtrace();
    foreach($backtrace[0]['args'] as &$arg)
        $arg .= 'baz';
}

test(&$test, &$test2);

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