Php 使用$this时,按引用或值赋值?
我对这个链表中的以下输出感到困惑Php 使用$this时,按引用或值赋值?,php,object,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;
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
我希望输出是ama
。我以为$copy
只是$this->firstNode
中存储的值的副本
这行代码不是按值赋值吗?如果它是一个引用赋值$copy=&$this->firstNode
,我希望输出是amm
,但如果它是一个值赋值,则输出不是
有人能澄清一下吗
编辑(附加示例)
公共功能评估列表(){
$copy=$this->firstNode->data;
echo$copy。“
”;
echo$this->firstNode->data。“
”;
$copy='m';
echo$copy。“
”;
echo$this->firstNode->data。“
”;
}
这是:
$copy = $this->firstNode;
不是对象的副本,而是指向原始对象的“指针”的副本,因此当您修改它时,您修改了基础对象。您需要使用关键字来获取真实副本:
$copy = clone $this->firstNode;
从PHP(我的重点):
将已创建的类实例分配给新实例时
变量,新变量将访问与对象相同的实例
那是分配的
从中可以看出,您的代码段现在输出:
aama
这:
不是对象的副本,而是指向原始对象的“指针”的副本,因此当您修改它时,您修改了基础对象。您需要使用关键字来获取真实副本:
$copy = clone $this->firstNode;
从PHP(我的重点):
将已创建的类实例分配给新实例时
变量,新变量将访问与对象相同的实例
那是分配的
从中可以看出,您的代码段现在输出:
aama
谢谢你的回答!一个简单的问题。如果它是一个属性,而不是对象Ex
$copy=$this->firstNode->data
,该怎么办?$copy
是指向属性的指针的副本还是按值赋值?您要查找的是深度副本。标准的clone
不是深度的,您需要实现自己的\uu clone()
方法来执行深度复制。尼克-那么您是说$copy=$this->firstNode->data
实际上没有进行复制?我编写了一些测试代码(请参见编辑:附加示例),它似乎通过了值,但没有复制。$copy
和$this->firstNode
都指向同一个对象。如果->data
是一个对象,则不会使用clone
复制它。相反,$copy->firstNode->value
和$this->firstNode->value
将指向同一个对象,除非您实现自己的\u clone()
方法。如果->value
不是对象,将复制它。当您使用术语按值传递
/按引用传递
时,这些术语在此处不适用,因为它们用于调用函数的上下文中,以及它们的参数是如何被接受的谢谢!一个简单的问题。如果它是一个属性,而不是对象Ex$copy=$this->firstNode->data
,该怎么办?$copy
是指向属性的指针的副本还是按值赋值?您要查找的是深度副本。标准的clone
不是深度的,您需要实现自己的\uu clone()
方法来执行深度复制。尼克-那么您是说$copy=$this->firstNode->data
实际上没有进行复制?我编写了一些测试代码(请参见编辑:附加示例),它似乎通过了值,但没有复制。$copy
和$this->firstNode
都指向同一个对象。如果->data
是一个对象,则不会使用clone
复制它。相反,$copy->firstNode->value
和$this->firstNode->value
将指向同一个对象,除非您实现自己的\u clone()
方法。如果->value
不是对象,将复制它。当您使用术语按值传递
/按引用传递
时,这些术语在此处不适用,因为它们用于调用函数的上下文以及如何接受其参数