我有一个php函数,它具有无限数量的args,我从func_get_args()获得。我有一些带参数的操作(改变字符串或做某事),我希望它像引用的传递参数。有可能吗?
示例:
$test = 'foo';
$test2 = 'bar';
function test(){
$args = func_get_args();
foreach($args as $arg)
$arg .= 'baz';
}
test($test, $test2);
答案 0 :(得分:14)
从PHP-5.6开始,您可以使用variadic引用:
function test(&...$args) {
foreach ($args as &$arg) {
$arg .= 'baz';
}
}
答案 1 :(得分:12)
正如在PHP: variable-length argument list by reference?中所回答的那样,PHP中没有办法组合变长和传递引用函数参数。相反,链接的答案使用声明100 &argx
s的hack,然后使用get_num_args()
来确定实际使用了多少{{1}}。恭喜,你在PHP中发现了一个特别困难的角落;)
答案 2 :(得分:5)
我非常怀疑这是可能的,但我确实知道一种方法可以得到你想要的东西:
function test(&$args) {
foreach ($args as $arg) {
$arg .= 'baz';
}
}
test(array(&$test, &$test2));
答案 3 :(得分:1)
这有效:
$test = 'foo';
$test2 = 'bar';
function test(){
$backtrace = debug_backtrace();
foreach($backtrace[0]['args'] as &$arg)
$arg .= 'baz';
}
test(&$test, &$test2);
但是,这使用了不推荐使用的call-time pass by reference。
答案 4 :(得分:1)
在做类似下面的示例时,对我来说很好。我认为关键是在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);
}
}
答案 5 :(得分:0)
我也需要这个功能,我提出了一个解决方案。
function sayhello($params) {
//params hold an unlimited amount of references
}
sayhello([&$one, &$two]);
这取决于php> = 5.4。如果您使用< = 5.4,请使用array()语法而不是[]。
我爱[] tho,好多了:)。
答案 6 :(得分:0)
使用对象是解决方案
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();
答案 7 :(得分:0)
function byref_alias()
{
//$argz=func_get_args(); //byval, not what you want
$argz=debug_backtrace()[0]['args']; //byref hack
$argz[0]++; works
}