PHP:通过引用的可变长度参数列表?

Posted

技术标签:

【中文标题】PHP:通过引用的可变长度参数列表?【英文标题】:PHP: variable-length argument list by reference? 【发布时间】:2010-12-27 20:53:18 【问题描述】:

是否可以创建一个 php 函数,通过引用获取可变数量的参数?

它没有帮助我通过引用接收值数组的函数,也没有将其参数包装在对象中的函数,因为我正在处理函数组合和参数绑定。 也不要考虑调用时的引用传递。那东西根本不应该存在。

【问题讨论】:

你的问题有点不清楚......主要是因为缺少一些单词和标点符号。 如果你想要一个引用数组(指向其他变量),那么我不确定这是否可以在 PHP 中完成(?) 也许 OP 应该回来重新表述这个问题,以便我们能够真正回答它。 :) 也许你可以给我们一个例子,说明为什么传递一个数组或一个包装元素的对象不适合你。 顺便说一句 PHP 5.6 有一个新的“splat 运算符”***.com/a/21387043/632951 【参考方案1】:

PHP 5.6 引入了支持传递引用的new variadic syntax。 (感谢@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

缺点是参数的数量受到定义的参数数量的限制(示例 sn-p 中为 6)。 但是使用 func_num_args() 你可以检测是否需要更多。

将超过 7 个参数传递给函数无论如何都是不好的做法;)

【讨论】:

是的,我想过这样做。到目前为止,这似乎是唯一的解决方案。不是很优雅,但很有效。 但是这些参数必须通过ref发送,不允许使用表达式。不是很方便。 "PHP 没有用于引用可变参数的内置函数。" 5.6之后是错误的。请在下面查看 outis 的答案。 我最终使用了这个:D【参考方案2】:

PHP 5.6 引入了支持传递引用的new variadic syntax。使用... 为函数添加最后一个参数的前缀将其声明为一个数组,该数组将保存从该点开始的任何实际参数。可以通过进一步为 ... 标记加上 &amp; 前缀来声明该数组以保存引用,就像对其他参数所做的那样,有效地使参数通过引用传递。

示例 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

【讨论】:

需要注意的是,在$v foreach ($args as $k =&gt; $v) 之前没有&amp; 对我有用【参考方案3】:

有可能:

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

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


test(&$test, &$test2);

但是,这使用了已弃用的调用时按引用传递。

【讨论】:

【参考方案4】:

编辑:抱歉,我没有看到您希望它们成为引用......您所要做的就是将它们作为对象传递。

例如,您也可以将它们传递到数组中

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

然后在函数中你只需

myfunction ($arguments) 

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


数组也可以嵌套。

【讨论】:

我实际上仍然不能 100% 确定您要问什么,但我希望我理解正确。 问题很简单。难的是解释为什么传递包裹在数组或对象中的参数不能满足我的需求(我是关于参数绑定和函数组合的事情)。 这是不正确的!在 PHP 中数组是按值传递的。【参考方案5】:

您应该能够传递包装在对象中的所有参数。


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

【讨论】:

以上是关于PHP:通过引用的可变长度参数列表?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 的可变长度参数 `...` 标记应该被称为啥?

Java 可变参数列表

Java 我在学反射的时候,遇到可变长度参数列表,具体的成员方法就是?

Java可变参数

如何使用只有一个参考参数的可变长度参数列表?

C++ 从可变长度参数列表中提取 std::string