讲师中心 微信公众号
AI工具推荐 视频效率加速

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

轻芳君_4714

轻芳君_4714

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

|

191人浏览过

|

来源于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免费学习笔记(深入)”;

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 简单类型(int、string、bool)可直接赋值:$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 不会替你猜,也猜不到。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
string转int
string转int

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

6899

2023.08.02

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

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

549

2023.09.22

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

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

1698

2024.03.01

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

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

6224

2023.10.24

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

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

6224

2023.10.24

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

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

6224

2023.10.24

curl_exec
curl_exec

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

3763

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

875

2023.10.30

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn