如何在php中通过引用传递无限参数[重复]
Posted
技术标签:
【中文标题】如何在php中通过引用传递无限参数[重复]【英文标题】:how to pass unlimited arguments by reference in php [duplicate] 【发布时间】:2011-10-25 00:10:55 【问题描述】:我有一个 php 函数,它有无限数量的 args,我从 func_get_args() 获得。我有一些带有参数的操作(更改字符串或做某事),我希望这就像通过引用传递参数。有可能吗?
示例:
$test = 'foo';
$test2 = 'bar';
function test()
$args = func_get_args();
foreach($args as $arg)
$arg .= 'baz';
test($test, $test2);
【问题讨论】:
【参考方案1】:从 PHP-5.6 开始,您可以使用 variadic 引用:
function test(&...$args)
foreach ($args as &$arg)
$arg .= 'baz';
【讨论】:
完美支持 5.6,不能再喜欢这个答案了,感谢更新!【参考方案2】:正如PHP: variable-length argument list by reference? 中所回答的那样,PHP 中无法组合可变长度并通过引用函数参数传递。相反,链接的答案使用声明 100 &argx
s 的技巧,然后使用 get_num_args()
来确定实际使用了多少。恭喜,你在 PHP 中找到了一个特别难的角落;)
它还展示了如何使用 PHP 5.6+ 可变参数来做到这一点。
【讨论】:
在 2014 年的 php5.6 之前是准确的。Markus 的答案现在更准确,因为它受支持。【参考方案3】:我非常怀疑这是否可能,但我知道一种方法可以让你得到你想要的:
function test(&$args)
foreach ($args as $arg)
$arg .= 'baz';
test(array(&$test, &$test2));
【讨论】:
看起来我们很快就能使用 PHP 5.6 中的新...
运算符来做到这一点。【参考方案4】:
这行得通:
$test = 'foo';
$test2 = 'bar';
function test()
$backtrace = debug_backtrace();
foreach($backtrace[0]['args'] as &$arg)
$arg .= 'baz';
test(&$test, &$test2);
但是,这使用了已弃用的调用时按引用传递。
【讨论】:
在 PHP 5.4+ 中根本不允许【参考方案5】:在执行以下示例时对我来说效果很好。我认为关键是在 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);
【讨论】:
【参考方案6】:我也需要这个功能,我想出了一个解决方案。
function sayhello($params)
//params hold an unlimited amount of references
sayhello([&$one, &$two]);
这取决于 php >= 5.4。如果您使用的是
我爱 [] 寿,好多了 :)
【讨论】:
您只传递了一个参数,它是一个数组(并且在使用对象是解决方案
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();
【讨论】:
【参考方案8】:function byref_alias()
//$argz=func_get_args(); //byval, not what you want
$argz=debug_backtrace()[0]['args']; //byref hack
$argz[0]++; works
【讨论】:
请记住,虽然这些参数是按引用的,但它们不会修改发送给函数的原始参数,而是会按引用发送。以上是关于如何在php中通过引用传递无限参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章