PHP对象复制举例分析
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容主要讲解"PHP对象复制举例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PHP对象复制举例分析"吧!原型模式可以看作是对象复制中的一个重要内
千家信息网最后更新 2025年02月01日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安全错误
数据库的锁怎样保障安全
华为网络技术大赛大专
Qt从数据库读取json
诺曼底软件开发
壹家之主互联网科技有限公司
2017年 网络安全态势
django数据库连接
余额宝风险管理软件开发
阿里云Linux服务器定时重启
上海粉笔网络技术
网络安全断网报警
法国 专利数据库
网络安全英语作文80字初中
软件开发公司有政府项目吗
开展数据库营销的网站
客户管理系统需要数据库吗
数据库中概念从大到小
db2新建数据库用户
数据库中安全约束是什么
135云流量服务器
综合管理视频服务器
地面贴图软件开发
浪潮网络安全工程师三班倒
专业技术人员网络安全知识下
日本期货软件开发
上海浪潮服务器供应商
nfs 服务器群集
裕华区品牌软件开发诚信经营
公司数据库造假要算犯法吗
德城区核酸服务器
计算机网络技术思考与练习