PHP对象复制举例分析
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容主要讲解"PHP对象复制举例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PHP对象复制举例分析"吧!原型模式可以看作是对象复制中的一个重要内
千家信息网最后更新 2025年12月02日PHP对象复制举例分析
本篇内容主要讲解"PHP对象复制举例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PHP对象复制举例分析"吧!
原型模式可以看作是对象复制中的一个重要内容。在学习原型模式时,我们了解到对象中的引用变量,也就是变量也是一个对象时,直接复制这个对象会导致其中的引用变量还是指向同一个对象。是不是有点绕,我们还是用例子来说明:
// clone方法
class testA{
public $testValue;
}
class A
{
public static $reference = 0;
public $instanceReference = 0;
public $t;
public function __construct()
{
$this->instanceReference = ++self::$reference;
$this->t = new testA();
}
public function __clone()
{
$this->instanceReference = ++self::$reference;
$this->t = new testA();
}
}
$a1 = new A();
$a2 = new A();
$a11 = clone $a1;
$a22 = $a2;
var_dump($a11); // $instanceReference, 3
var_dump($a22); // $instanceReference, 2
$a1->t->testValue = '现在是a1';
echo $a11->t->testValue, PHP_EOL; // ''
$a2->t->testValue = '现在是a2';
echo $a22->t->testValue, PHP_EOL; // 现在是a2
$a22->t->testValue = '现在是a22';
echo $a2->t->testValue, PHP_EOL; // 现在是a22
// 使用clone后
$a22 = clone $a2;
var_dump($a22); // $instanceReference, 4
$a2->t->testValue = '现在是a2';
echo $a22->t->testValue, PHP_EOL; // NULL
$a22->t->testValue = '现在是a22';
echo $a2->t->testValue, PHP_EOL; // 现在是a2
首先,通过变量的变化,我们可以看出使用clone关键字的对象复制会调用__clone()方法。这个魔术方法正在原型模式的核心所在。在这个方法中,我们可以重新实例化或者定义对象中的引用成员。通过clone,我们让t成为了新的对象,从而避免引用带来的问题。
在对象的复制中,我们需要特别注意的递归引用的问题。也就是对象内部引用了自身,将会导致来回的重复引用形成递归死循环。
// 循环引用问题
class B
{
public $that;
function __clone()
{
// Segmentation fault: 11
$this->that = clone $this->that;
// $this->that = unserialize(serialize($this->that));
// object(B)#6 (1) {
// ["that"]=>
// object(B)#7 (1) {
// ["that"]=>
// object(B)#8 (1) {
// ["that"]=>
// *RECURSION* 无限递归
// }
// }
// }
}
}
$b1 = new B();
$b2 = new B();
$b1->that = $b2;
$b2->that = $b1;
$b3 = clone $b1;
var_dump($b3);B类中的that指向自身的实例,两个对象相互指向后再进行复制,就会出现这种死循环的情况。使用序列化和反序列化输出后,我们会看到RECURSION的引用提示。这就是形成了递归的死循环。这种情况一定要极力避免。
上述例子中,我们使用了序列化和反序列化这一招来解决引用问题。对象复制的对象变量来说(对象变量里面还有更多层次的引用变量),这种方式能够一次性地在最顶层的对象__clone()方法中解决引用问题。
到此,相信大家对"PHP对象复制举例分析"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
对象
变量
方法
问题
序列
递归
循环
分析
内容
原型
实例
指向
模式
学习
也就是
例子
情况
更多
还是
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
王者荣耀安卓服务器哪个好
多措并举提升网络安全
slite是数据库吗
关于计算机网络技术的理想
GBI数据库
青少年与网络安全板报
表格函数如何去重复的数据库
网络技术公司转出的钱
网络安全信息年初工作会
网络安全面临的严重挑战包括哪些
广州易双网络技术有限公司图片
网络安全设备管理规定
深圳 电信网络技术
数字贸易的网络安全
软件开发关闭软件要输入密码
网站服务器多少钱一年
学软件开发什么书好
三级网络技术有题库
手机软件开发特征
苹果软件开发麻烦吗
网络安全是关系国家主权
互联网科技最大公司
工商银行软件开发中心职责
正宗网络技术培训流程
自由城计划怎么开服务器
服务器系统iis无法安装
互动体验网络安全展厅信息化
人工神经网络技术前景
近代农业数据库
通信工程要学网络安全吗