PHP: список аргументов переменной длины по ссылке? - PullRequest
22 голосов
/ 18 декабря 2009

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

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

Ответы [ 5 ]

13 голосов
/ 20 декабря 2009

В 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 параметров в любом случае является плохой практикой;)

6 голосов
/ 27 октября 2014

В PHP 5.6 введен новый вариационный синтаксис , который поддерживает передачу по ссылке. Префикс последнего параметра к функции с ... объявляет его как массив, который будет содержать любые фактические аргументы с этого момента. Массив может быть объявлен для хранения ссылок путем дальнейшего добавления префикса ... к &, как это делается для других параметров, что позволяет эффективно передавать аргументы по ссылке.

Пример 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
0 голосов
/ 12 августа 2011

Возможно:

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

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

test(&$test, &$test2);

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

0 голосов
/ 18 декабря 2009

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

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

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

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

myfunction ($arguments) {

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

}

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

0 голосов
/ 18 декабря 2009

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


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

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