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
不是对象,将复制它。当您使用术语
按值传递
/
按引用传递
时,这些术语在此处不适用,因为它们用于调用函数的上下文以及如何接受其参数