php 中对象变量存储的是对象标识符(handle),而非实际数据,因此赋值操作不会复制对象,而是共享同一实例;若需独立副本,必须显式使用 `clone` 或其他深拷贝策略。
在 PHP 中,对象不是按值传递的——这是与标量类型(如 int、string)最根本的区别。当你执行 $newlist[5] = $ref;(其中 $ref 是一个对象),你并非创建了该对象的新副本,而是让 $newlist[5] 指向内存中同一个对象实例。这意味着:对 $newlist[5] 的任何修改(如调用 SetTest(5))会直接反映在原始对象上(例如 $listOfTest[4]),从而导致意外的状态污染。
clone 关键字会触发对象的浅拷贝(shallow copy):它创建一个新对象实例,并复制所有非引用型属性值。对于仅含基本类型属性(如本例中的 private int $m_test)的类,clone 完全满足需求:

function getNewList(TestBase $ref): array
{
$newlist = [
3 => clone $ref, // 新实例,独立于原对象
5 => clone $ref // 另一个新实例
];
$newlist[3]->SetTest(3);
$newlist[5]->SetTest(5);
return $newlist;
}✅ 此时 $listOfTest[4] 不再被修改,输出仍为 2、4、6。
__clone() 魔术方法:若对象包含其他对象属性(如嵌套对象、资源或动态生成的依赖),需在类中定义 __clone() 方法,手动克隆子对象,否则仍会共享引用:
public function __clone()
{
if ($this->nestedObject instanceof \stdClass) {
$this->nestedObject = clone $this->nestedObject;
}
}避免误用引用赋值(&$var):示例答案中出现的 $ref = &$listOfTest[4]; 并不能解决问题,反而加剧混淆——它使 $ref 成为 $listOfTest[4] 的引用别名,后续任何对 $ref 的修改等同于直接操作原数组元素,完全违背隔离意图。
大规模场景优化建议:
总之,PHP 的对象引用语义是明确且一致的设计,关键在于开发者需主动识别并管理对象生命周期。永远不要假设对象赋值 = 复制;需要副本时,显式 clone 是最清晰、最可控的选择。
# php
# 区别
# 为什么
# String
# 标识符
# int
# private
# var
# 值传递
# 引用传递
# copy
# 对象
# 序列化
# 的是
# 是一个
# 进阶
# 这是
# 句柄
# 当你
# 或其他
# 解决问题
# 并不能
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
LINUX如何开放防火墙端口_Linux firewalld与iptables开放端口命令【安全配置】
php怎么下载安装后无法解析php文件_服务器配置检查【解答】
Windows10系统怎么查看设备管理器_Win10快捷键Win+X菜单使用
用Python构建微服务架构实践_FastAPI与Django对比详解
Win10怎样清理C盘浏览器缓存_Win10清理浏览器缓存步骤【步骤】
如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法
Windows10如何更改系统字体大小_Win10辅助功能文本缩放设置
如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题
Win11怎么开启远程桌面连接_Windows11系统属性远程设置
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
跨文件调用类方法怎么用_php作用域操作符与自动加载配合【介绍】
如何在Golang中定义接口_抽象方法和多态实现
如何使用正则表达式批量替换重复的“-”模式为固定字符串
Python解释执行模型_字节码流程说明【指导】
php高频调试功能有哪些_php常用调试函数与工具汇总【解答】
c++获取当前时间戳_c++ time函数使用详解
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
Win11怎么设置屏保_Windows 11屏幕保护程序开启与设置【详解】
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】
Windows怎样关闭桌面弹窗广告_Windows关闭桌面弹窗设置【教程】
Win11系统更新后黑屏怎么办 Win11更新黑屏修复教程【方法】
Win10系统更新错误0x80240034怎么办 Win10更新错误解决法【方法】
VSC里PHP变量未定义报错怎么解决_错误抑制技巧【解答】
php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】
php内存溢出怎么排查_php内存限制调试与优化方法【说明】
Python迭代器生成器进阶教程_节省内存与懒加载实战
Win11如何隐藏桌面图标 Win11一键隐藏/显示桌面图标【指南】
Python对象比较与排序_魔术方法解析【教程】
如何使用Golang实现容器自动化运维_Golang Docker运维管理方法
mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】
如何使用Golang实现微服务事件驱动_使用消息总线解耦服务
如何测试您的网站全球打开速度-网站海外测速工
MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第三方工具加密【教程】
php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】
Win10怎样清理C盘爱奇艺缓存_Win10清理爱奇艺缓存步骤【步骤】
如何使用Golang实现云原生应用弹性伸缩_自动应对流量变化
Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度
php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】
Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】
Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】
Win11如何设置系统语言_Win11系统语言切换教程【攻略】
Win11怎么设置默认PDF阅读器 Win11修改PDF打开方式【步骤】
Win10如何卸载自带Edge_Win10彻底卸载Edge浏览器教程【攻略】
Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】
c++中如何求一个数的平方根_c++ sqrt函数与牛顿迭代法
Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Python项目回滚策略_发布安全说明【指导】
怎么将XML数据可视化 D3.js加载XML
2026-01-02
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。