0

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

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而不是值赋值。

有人可以澄清一下吗?

编辑(附加示例)

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/>";       
}
4

1 回答 1

3

这:

$copy = $this->firstNode;

不是对象的副本,它是指向原始对象的“指针”的副本,所以当你修改它时,你修改了底层对象。您需要使用clone关键字才能获得真实副本:

$copy = clone $this->firstNode;

来自 PHP文档(强调我的):

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

您可以从此示例中看到您的代码片段现在输出:

aama
于 2013-01-18T16:58:36.620 回答