面向对象PHP之Clone对象
###序言 我们这里讨论的Clone
是指的 PHP5 之后的版本。PHP5 之后 如果这样复制对象是将指向对象的引用进行复制。
$p1=new Person();
$p2=$p1;
复制代码
而使用clone
关键字则是对对象的实际内存内容进行复制,相当于重新开辟了一个内存块和一个指向该内存块的引用。
$p3=clone $p1;
复制代码
在实际场景中有时候不希望对内存中的内容完全的进行复制,这里 PHP 提供了一个内置的函数__clone()
,该函数在对象进行克隆时会自动调用,这里需要特别注意的是,__clone()
函数作用域里的$this
关键字指代的是***克隆后产生的对象***,而不是被克隆的对象,下面用代码来演示一下。
###实例
class Person{private $name='yang';private $age=18;public function setName($name){$this->name=$name;}function __clone(){$this->name='xiaoming';}
}
$p1=new Person();
$p2=$p1;
$p3=clone $p1;
echo 'Before $p1 change';
var_dump($p1);
var_dump($p2);
var_dump($p3);
$p1->setName('yang1');
echo 'After $p1 change';
var_dump($p1);
var_dump($p2);
var_dump($p3);
复制代码
查看运行结果:
我们可以看到在对象$p1
改变之后对象$p2
也相应的改变了,这是因为$p1
,$p2
两个变量只是指向对象内存的引用,这里学习过C语言的应该已经清楚了,就跟C语言的指针类似。而当保存对象真正的内存里面的内容改变后,我们通过$p1
,$p2
这两个引用去访问的其实同一个内容,当然得到的内容是一样的,同时我们看到$p3
的值在$p1
变化后并没有发生变化。
这里$p3
变量如果Person
类里面没有__clone()
方法,其指向的内存块里面包含的内容其实是和$p1
是一样的(注意不是内存块一样,是两个不同的内存块里面包含的数据一样),在加了__clone()
方法后,我们发现在克隆$p1
后$p3
内存内的name
属性已经变成了xiaoming
。
可能语言表示的不是太清楚,下面用图来表示一下。
###小结
在PHP中赋值的默认复制方法是引用的复制,当我们有的时候不想在两个复制的对象之间共用某一属性(或者对象)时,我们就可以使用clone
关键字,这样就相当于给复制出来的新对象重新开辟了一个内存块,对新旧两个对象的相关属性(或者对象)操作就不会相互影响了。
面向对象PHP之Clone对象相关推荐
- php开发面试题---php面向对象详解(对象的主要三个特性)
php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...
- Java中对clone对象的认知
个人资源与分享网站:http://xiaocaoshare.com/ 一.为什么要使用clone? 主要应用于:实际开发中,A,B两个对象之间值的拷贝,A为原对象,后面对B的改动不会影响到A. 二.c ...
- JavaScript – 6.JS面向对象基础(*) + 7.Array对象 + 8.JS中的Dictionary + 9.数组、for及其他...
6.JS面向对象基础(*) 7.Array对象 7.1 练习:求一个数组中的最大值.定义成函数. 7.2 练习:将一个字符串数组输出为|分割的形式,比如"刘在石|金钟国|李光洙|HAHA|宋 ...
- 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)
编程范式: 命令式编程/声明式编程 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数) 高阶函数 filter/map/reduce filter中的回调函数有一个要求: 必须返 ...
- 如何理解clone对象
首先明白为什么要用clone? 在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动 ...
- 面向对象编程——类和对象
面向对象编程 类和对象 类(Class):用来描述具有相同属性和方法的对象的集合 class Student:name='stu'#属性def say(self):#方法print("hel ...
- Python零基础速成班-第9讲-Python面向对象编程(上),对象和类、初始化、继承、重写、多态、类方法、组合
Python零基础速成班-第9讲-Python面向对象编程(上),对象和类.初始化.继承.重写.多态.类方法.组合 学习目标 修饰器 面向对象编程:对象和类.初始化.继承.重写.多态.类方法.组合 课 ...
- Java—面向对象设计—类和对象
理解面向对象程序设计 面向对象程序(Object-oriented programming,OOP)设计是继面向过程又一具有里程碑意义的编程思想,是现实世界模型的自然延伸.下面从结构化程序设计说起,逐 ...
- python对象可分为什么_Python是面向对象的编程语言,而对象拥有各种特性、功能,专业术语称之为____...
[综合练习]I took advice on the matter. [单选题]在使用仿制图章工具去除瑕疵时,需结合( )键,才能完成样本的取样. [综合练习]Only a very slight a ...
- Java入门姿势【面向对象:1】啥事面向对象、类和对象如何理解
面向对象是编程开发的一种编程范式. 这次我们来详细了解一下Java面向对象,面向对象的思想已经涉及到软件开发的各个方面,如:面向对象的分析,面向对象的设计.以及我们经常说的面向对象的编程实现 其余的一 ...
最新文章
- 网络编程学习笔记(poll函数)
- 传智C++课程笔记-1
- 中航工业集团金网络(北京)电子商务有限公司副总经理刘正珩:航空“智”造的供应链支撑平台...
- Android Studio 导入 AOSP 源码
- 在Visual Studio 2017中找不到.NET Framework 4.6.2
- 1-7华为HCNA认证eNSP基础B
- 外部IC寄存器的位定义
- Kubernetes — 监控方案
- 记录阿里云增加二级域名步骤[同三级]
- Ubuntu 18.04 安装搜狗拼音输入法出现乱码的
- 数学概念: 导数和切线方程
- 【Python3】作业车间调度,SPT规则,LPT规则
- acs代表什么_ACS 是什么意思
- python办公自动化 使用openpyxl合并excel表格
- ArcGIS导入xyz序列并绘制地形图(含等高线、面体积、点距离的计算)
- r导入txt乱码_R中导入excel乱码的解决办法
- 危险废物自动化立体仓库设计方案
- docker的容器下使用apt-get update卡在[0%] Working问题解决办法
- hex文件、out文件、bin文件、map文件解析
- Web安全 Acunetix漏洞扫描工具.