PHP引用传递混淆


PHP Pass by reference confusion

长话短说,我有以下函数作为我的框架的一部分:

public function use_parameters()
{
    $parameters = func_get_args();
    $stack = debug_backtrace();
    foreach($stack[0]['args'] as $key => &$parameter)
    {
        $parameter = array_shift($this->parameter_values);
    }
}

其中$this->parameter_values=数组('value1','value2','value3','value 4','value 5',…);

用于以下上下文:

$instance->use_parameters(&$foo, &$bah);

分配:

$foo = 'value1';
$bah = 'value2';

再次调用

$instance->use_parameters(&$something); 

将设置

$something = 'value3'

等等

从5.3开始,它将返回一个"不推荐使用:引用调用时间传递已被推荐使用"警告。为了符合5.3的工作方式,我删除了&amps导致:

$instance->use_parameters($foo, $bah);

不幸的是,这导致争论无法确定,我正在努力想出解决方案。

值得一提的是,我在Apache/2.2.16(Debian)上运行PHP v.3.3-7

如有任何帮助,我们将不胜感激。

在PHP中不能做到这一点,而且您正在滥用引用的概念。您必须显式指定引用参数,尽管使用默认值但是,你不想使用NULL作为默认值,因为这是未分配的引用变量的设置值。因此,你需要定义一些你知道不会用作参数的常量,现在代码看起来像

    const dummy="^^missing^^";
    public function use_parameters(&$a, &$b=self::dummy, &$c=self::dummy ) {
        $a=array_shift($this->parameter_values);
        if($b!==self::dummy) $b=array_shift($this->parameter_values);
        if($c!==self::dummy) $c=array_shift($this->parameter_values);
        # add $d,$e,$f,... as required to a sensible max number
    }

请注意,因为您正确地使用了引用,所以不需要debug_backtrace()botch。

在PHP 5或。。。正如您所看到的,您可以,但它已被弃用并引发警告。您必须有一个预定义的函数参数的最大计数,或者使用一个数组:

public function use_parameters(&$arg1, &$arg2 = NULL, &$arg3 = NULL)
{
    // if ($arg2 !== NULL)
    // if ($arg3 !== NULL)
}
$parameters = array(0 => &$foo, 1 => &$bah);
public function use_parameters($args)
{
    // Handle the array elements
}