我对此链接列表中的以下输出感到困惑
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/>";
}
答案 0 :(得分:3)
此:
$copy = $this->firstNode;
不是对象的副本,它是原始对象的“指针”的副本,因此当您修改它时,您将修改基础对象。您需要使用clone
关键字来获取真实副本:
$copy = clone $this->firstNode;
来自PHP docs(强调我的):
将已创建的类实例分配给新的 变量,新变量将作为对象访问相同实例 分配了。
您可以从this example看到您的代码段现在输出:
aama