使用$ this时按引用或值分配?

时间:2013-01-18 16:55:26

标签: php object

我对此链接列表中的以下输出感到困惑

class ListNode{
    public $next = NULL;
    public $data = NULL;
    public function __construct($data){
        $this->data = $data;
    }

}

class LinkedList{
    private $firstNode = NULL;
    private $lastNode = NULL;


    public function insertFirst($data){
        $link = new ListNode($data);
        $link->next = $this->firstNode;
        $this->firstNode = &$link;
        if($this->lastNode == NULL){
            $this->lastNode = &$link;
        }

    }

    public function readList(){
        while($this->firstNode != NULL){
            echo $this->firstNode->data;
            $this->firstNode = $this->firstNode->next;
        }
    }

    public function assessList(){
        $copy = $this->firstNode;
        echo $copy->data;
        echo $this->firstNode->data;
        $copy->data = 'm';
        echo $copy->data;
        echo $this->firstNode->data;        
    }

}

$linkedList = new LinkedList();
$linkedList->insertFirst('c');
$linkedList->insertFirst('b');
$linkedList->insertFirst('a');
//$linkedList->readList();  //output a b c
$linkedList->assessList();  //outputs a a m m

我希望输出为a a m a。我认为$copy只是$this->firstNode中存储的值的副本。

这行代码$copy = $this->firstNode不是按值分配的吗?如果它是引用a a m m的赋值,我希望输出为$copy = &$this->firstNode,但如果它是按值分配则不会。{/ p>

有人可以澄清一下吗?

编辑(附加示例)

public function assessList(){
    $copy = $this->firstNode->data;
    echo $copy. "<br/>";
    echo $this->firstNode->data. "<br/>";
    $copy = 'm';
    echo $copy. "<br/>";
    echo $this->firstNode->data. "<br/>";       
}

1 个答案:

答案 0 :(得分:3)

此:

$copy = $this->firstNode;

不是对象的副本,它是原始对象的“指针”的副本,因此当您修改它时,您将修改基础对象。您需要使用clone关键字来获取真实副本:

$copy = clone $this->firstNode;

来自PHP docs(强调我的):

  

将已创建的类实例分配给新的   变量,新变量将作为对象访问相同实例   分配了。

您可以从this example看到您的代码段现在输出:

aama