как передавать неограниченные аргументы по ссылке в php

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

пример:

$test = 'foo'; $test2 = 'bar'; function test(){ $args = func_get_args(); foreach($args as $arg) $arg .= 'baz'; } test($test, $test2); 

Как ответил PHP: список аргументов переменной длины по ссылке? , Нет никакого способа, в PHP для объединения переменной длины и передать аргументы функции ссылки. Вместо этого связанный ответ использует взлом объявления 100 &argx s, а затем используя get_num_args() чтобы выяснить, сколько из них фактически использовалось. Поздравляем, вы нашли особенно трудный угол в PHP;)

Начиная с PHP-5.6 вы можете использовать вариационную ссылку:

 function test(&...$args) { foreach ($args as &$arg) { $arg .= 'baz'; } } 

Я очень сомневаюсь, что это возможно, но я знаю, как вы можете получить то, что хотите:

 function test(&$args) { foreach ($args as $arg) { $arg .= 'baz'; } } test(array(&$test, &$test2)); 

Это работает:

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

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

Мне также нужна была эта функциональность, я придумал решение.

 function sayhello($params) { //params hold an unlimited amount of references } sayhello([&$one, &$two]); 

Это зависит только от php> = 5.4. Если вы используете <= 5.4, используйте синтаксис array () вместо [].

Я люблю [] tho, намного лучше 🙂

Использование объектов – это решение

 class O { public $v; public function __construct(&$p){ $this->v = &$p; } } function append_baz_to_all(){ foreach(func_get_args() as &$arg){ $arg->v .= 'baz'; } } function test1(){ echo "test1\n"; $a='A';$b='B';$c='C';$d='D';$e='E';$f='F';$g='G'; echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n"); append_baz_to_all(new O($a), new O($b)); echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n\n"); } //shortcutting function o(&$v){return new O($v);} function test2(){ echo "test2\n"; $a='A';$b='B';$c='C';$d='D';$e='E';$f='F';$g='G'; echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n"); append_baz_to_all(o($c), o($d), o($e)); echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n\n"); } test1(); test2(); 
 function byref_alias() { //$argz=func_get_args(); //byval, not what you want $argz=debug_backtrace()[0]['args']; //byref hack $argz[0]++; works } 

Прекрасно подходит для меня, когда вы делаете что-то вроде приведенного ниже примера. Я думаю, что ключ устанавливает ссылку в foreach.

 $var1 = '%DIR%/test'; replaceParameters( $var1, $var2, $var3 ); function replaceParameters(&$variables) { $variables = array_filter(func_get_args()); $parameters = [ '%DIR%' => __DIR__, '%FILE%' => __FILE__, ]; foreach($variables as &$variable) { $variable = str_replace(array_keys($parameters), array_values($parameters), $variable); } }