如何理解PHP中的对象引用,浅复制以及深复制
本篇文章给大家分享的内容是关于如何理解PHP中的对象引用,浅复制以及深复制 ,有需要的朋友可以参考一下
很多新手PHPer对oop编程不熟的容易对这些概念忽视,最近在读初级PHP工程师这本书的时候对对象引用这一部分比较模糊,查了一些资料,理解了一下,想在此做一下记录,告诉自己这些基础一定要巩固好。
参考文章:https://blog.csdn.net/hel12he/article/details/49617023
https://blog.csdn.net/koastal/article/details/52163483
首先我们应该先明白PHP中内存空间是如何分布的。一般来说,内存空间分为堆内存,栈内存,数据段,代码段,如下图:
那么什么是对象的引用呢?
当我们使用new关键字对某个类进行实例化的时候,我们可以通过这个对象来访问该类中的属性以及方法。并且每个对象之间都是独立的,例如一个汽车类有着大小,颜色等属性,有行驶的方法,这个类可以被实例化成多个对象,每个对象的属性方法都可以修改,也就是说对象是有自己的内存空间的,它里面包含了实例该类的属性以及方法,对对象进行引用,或者说是使用别名,实际上指向的是同一个内存空间,例如:
<?php class One { public $name; public function __construct($name) { $this->name = $name; } } //实例化,并且向构造函数传递参数 $o1 = new One('test1'); echo "对象1的name值为:".$o1->name."<br/>"; //引用 $o2 = $o1; //打印对象2的$name属性 echo "对象2的name值为:".$o2->name."<br/>"; //修改对象$o2的$name属性 echo "修改对象2的name为test2"."<br/>"; $o2->name = 'test2'; //比较此时两个对象的$name值 echo "修改后对象1的name值为:".$o1->name."<br/>"; echo "修改后对象2的name值为:".$o2->name."<br/>";
打印结果:
由此可知,引用本质上只是只是对象的别名而已,实际上被引用对象和引用对象指向的内存空间还是一样的。(这里$o2=&o1的效果也是一样的)。
那么什么是浅复制呢?
概念:使用clone来复制对象,这种复制叫做“浅复制“,被赋值对象的所有变量都还有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。也就是说,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
我们使用相同的例子,把$o2=$o1改成$o2=clone $o1.看看会发生什么。打印结果如下图:
可以看到,当我们只修改对象2的值的时候,对象1的并没有发生改变,因为使用clone关键字是生成了一个对象的副本,这个副本也是有自己的内存空间的,它们之前相互独立。但是浅复制中是没有把它所引用的对象也复制下来。
前面说的东西都是内容只有数值的情况,当内容中也有引用的对象那就不一样了,也就引出了深复制的概念。
深复制概念:被复制的对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。也就是说深复制把要复制的对象所引用的对象都复制了一遍。
两种方法:
①利用__clone魔术方法
public function __clone() { $this->obj = new Obj(); }
②利用串行化
$t = serialize($o1); $o2 = unserialize($t);
举个栗子:
<?php header("Content-type:text/html;charset=utf-8"); class TvControl{ } class Tv{ private $color; private $tvControl; function __construct(){ $this->color = "black"; $this->tvControl = new TvControl(); } function getTvControl(){ return $this->tvControl; } } $tv1 = new Tv(); $tvControl1 = $tv1->getTvControl(); echo "原始类:"."<br/>"; var_dump($tv1); echo "<br/>"; $tv2 = $tv1; echo "引用类:"."<br/>"; var_dump($tv2); echo "<br/>"; $tv3 = clone $tv1; echo "克隆(浅复制):"."<br/>"; var_dump($tv3); echo "<br/>"; $tv4 = unserialize(serialize($tv1)); echo "深复制:"."<br/>"; var_dump($tv4);
打印结果:
深复制获取到的对象也是一个全新的对象。
那么如何比较两个对象是否引用于同一个对象呢?
我么可以使用“===”来进行比较两个对象是否引用于同一个初始对象。而“==”只能比较两个对象是否具有相同的类和属性。
相关推荐:
以上是如何理解PHP中的对象引用,浅复制以及深复制 的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。
