是否可以创建一个PHP函数,通过引用获取所有参数的可变数量?
它没有帮助我通过引用接收一个值数组的函数,也没有一个函数将其参数包含在一个对象中,因为我正在处理函数组合和参数绑定。 不要考虑呼叫时间传递参考。那东西甚至不应该存在。
答案 0 :(得分:13)
PHP 5.6引入了new variadic syntax,它支持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个参数传递给函数是不好的做法;)
答案 1 :(得分:6)
PHP 5.6引入了一个支持pass-by-reference的new variadic syntax。将最后一个参数前缀为具有...
的函数将其声明为一个数组,该数组将保存该点上的任何实际参数。可以通过在...
标记前面添加&
来声明数组来保存引用,就像对其他参数一样,有效地使参数传递给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
答案 2 :(得分:0)
您应该能够传递包装在对象中的所有参数。
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
答案 3 :(得分:0)
编辑:抱歉,我没有看到你希望它们成为引用....所有你需要做的就是将它们作为一个对象传递。
您也可以在数组中传递它们,例如
myfunction(array('var1' => 'value1', 'var2' => 'value2'));
然后在函数中你只是
myfunction ($arguments) {
echo $arguments['var1'];
echo $arguments['var2'];
}
阵列也可以嵌套。
答案 4 :(得分:0)
有可能:
$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。