簡體   English   中英

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 = array('value1','value2','value3','value4','value5',...);

在以下上下文中使用:

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

分配:

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

再次打電話給它

$instance->use_parameters(&$something); 

將設置

$something = 'value3'

等等。

從5.3開始,它將返回“已棄用:調用時間傳遞引用已被棄用”警告。 為了符合5.3的工作方式,我刪除了導致:

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

不幸的是,這導致了這些論點沒有確定,我正在努力想出一個解決方案。

值得我在Apache / 2.2.16(Debian)上運行PHP v5.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()。

你不能在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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM