You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何PHP中该对象比较输出为SAME?传参与克隆的差异问询

PHP对象引用与恒等运算符的疑问解答

首先看你提供的代码(注:原代码里有一个多余的闭合大括号,属于笔误,不影响核心逻辑):

class university {
    function hello($name){
        return $this->name;
    }
}
function compare1(&$obj1 , $obj2){
    if ($obj1 === $obj2) {
        return TRUE;
    }else {
        return FALSE;
    }
}
$uni1 = new university();
$uni2 = new university();
$uni3 = $uni1;
echo compare1($uni1 , $uni3) ?"SAME" : "DIFFERENT";

咱们一步步拆解你的疑问:

一、为什么$uni3 = $uni1时输出SAME?

首先得明确PHP中对象赋值的核心规则:对象变量存储的并不是对象本身,而是指向对象的「引用」。当你执行$uni3 = $uni1时,并没有复制整个对象,只是把$uni1里的对象引用复制给了$uni3——也就是说,$uni1和$uni3现在都指向内存中的同一个对象实例,就像两把钥匙开同一扇门。

再看compare1函数的参数传递:

  • 第一个参数&$obj1是引用传递:它直接关联到原变量$uni1,指向的还是那个唯一的对象;
  • 第二个参数$obj2是值传递:但对于对象来说,值传递传递的是「对象引用的副本」——这个副本仍然指向同一个对象,并没有创建新的对象。

而PHP的恒等运算符===比较对象时,判断标准是:两个变量是否指向内存中的同一个对象实例,不是比较对象的内容是否一致。此时$obj1和$obj2指向的是同一个对象,所以===返回TRUE,最终输出SAME。

二、为什么$uni3 = clone $uni1时输出DIFFERENT?

clone关键字的作用就是创建一个完全独立的新对象实例:它会复制原对象的所有属性值,但新对象在内存中是一个全新的实体,相当于复制了一套和原对象一模一样的房子,现在两把钥匙分别开两扇独立的门。

这时候$uni1指向原对象,$uni3指向克隆出来的新对象,两者指向的是不同的内存地址。当compare1函数用===比较时,会判断出它们不是同一个对象实例,所以返回FALSE,最终输出DIFFERENT。

内容的提问来源于stack exchange,提问作者Fares Ars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:57:49