0

0

PHP__clone方法如何实现对象克隆_PHP__clone方法实现对象克隆步骤【步骤】

星夢妙者

星夢妙者

发布时间:2026-02-26 19:43:03

|

151人浏览过

|

来源于php中文网

原创

__clone 方法仅在显式使用 clone 关键字时被调用,赋值、传参或返回对象不会触发;若未定义则执行浅拷贝,定义后需手动复制属性,不可赋值 $this,继承时应调用 parent::__clone() 并重置业务唯一字段。

php__clone方法如何实现对象克隆_php__clone方法实现对象克隆步骤【步骤】

PHP __clone 方法什么时候会被调用

只有在你显式使用 clone 关键字复制对象时,__clone 才会被触发。它不会在赋值($b = $a)、函数传参或返回对象时自动运行——PHP 对象默认就是引用传递,这些场景根本不会产生新实例。

常见错误现象:__clone 完全没执行,结果发现你只是写了 $new = $old,以为这就算“克隆”了。

  • 必须写 $new = clone $old;,否则 __clone 永远不会进
  • 如果类没定义 __clone,PHP 会做浅拷贝(即只复制对象属性值,不递归克隆嵌套对象)
  • 一旦定义了 __clone,PHP 就不再自动处理属性复制,你得手动写 $this->prop = $that->prop; 或调用 parent::__clone();

为什么不能直接在 __clone 里用 $this = $that

这是新手最常试也最常错的操作:$this = $that__clone 里完全无效,甚至会报 Fatal error: Cannot re-assign $this。PHP 的 $this 是只读的当前对象引用,不能被覆盖。

正确做法是逐个重置属性。尤其要注意资源型、对象型、数组型属性是否需要深拷贝。

立即学习PHP免费学习笔记(深入)”;

Replit Agent
Replit Agent

Replit最新推出的AI编程工具,可以帮助用户从零开始自动构建应用程序。

下载
  • 简单类型(intstringbool)可直接赋值:$this->id = $that->id;
  • 嵌套对象要显式 clone$this->handler = clone $that->handler;
  • 资源(如 curl 句柄、文件指针)无法克隆,必须重新初始化或设为 null
  • 静态属性和常量不受 __clone 影响,它们属于类,不属于实例

__clone 中漏掉 parent::__clone() 会怎样

如果你继承了一个父类,而父类自己实现了 __clone 来处理关键属性,但子类重写了它却忘了调用 parent::__clone(),那么父类那部分逻辑就彻底丢失了——比如数据库连接被关闭、缓存句柄未重置、内部计数器没归零。

这不是语法错误,而是静默失效。调试时很难定位,因为对象看起来“能用”,但某些状态已损坏。

  • 只要父类有自定义 __clone,子类重写时第一行建议加 parent::__clone();
  • 如果父类没有 __clone,调用 parent::__clone() 会报 Fatal error: Call to parent::__clone() when current class doesn't extend any class
  • 安全写法是先判断:if (method_exists('parent', '__clone')) { parent::__clone(); }

克隆后 ID、时间戳、唯一标识等字段怎么处理

很多业务对象带自增 ID、创建时间、token 等一次性字段,克隆时若不重置,会导致两个对象拥有相同 ID,后续保存进数据库或校验时出问题。

这不是 __clone 的职责边界问题,而是业务逻辑必须介入的地方。PHP 不可能知道你的 $id 是主键还是普通编号。

  • 数据库模型类克隆后应清空 $this->id$this->created_at
  • 带 token 的会话对象,克隆后需生成新 $this->token = bin2hex(random_bytes(16));
  • 避免在 __clone 里做耗时操作(如查库、发 HTTP 请求),它应该轻量、确定、无副作用
克隆不是复制粘贴,它是对对象生命周期的一次主动干预。最容易被忽略的,是那些没写在属性列表里、却真实影响行为的状态——比如一个闭包绑定的上下文、一个未显式声明的私有资源句柄、或者某个第三方 SDK 内部维护的单例引用。这些,__clone 不会替你猜,也猜不到。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

248

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

906

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

832

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

832

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

832

2023.08.22

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

452

2023.06.14

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号