###序言 我们这里讨论的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对象相关推荐

  1. php开发面试题---php面向对象详解(对象的主要三个特性)

    php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...

  2. Java中对clone对象的认知

    个人资源与分享网站:http://xiaocaoshare.com/ 一.为什么要使用clone? 主要应用于:实际开发中,A,B两个对象之间值的拷贝,A为原对象,后面对B的改动不会影响到A. 二.c ...

  3. JavaScript – 6.JS面向对象基础(*) + 7.Array对象 + 8.JS中的Dictionary + 9.数组、for及其他...

    6.JS面向对象基础(*) 7.Array对象 7.1 练习:求一个数组中的最大值.定义成函数. 7.2 练习:将一个字符串数组输出为|分割的形式,比如"刘在石|金钟国|李光洙|HAHA|宋 ...

  4. 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)

    编程范式: 命令式编程/声明式编程 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数) 高阶函数 filter/map/reduce filter中的回调函数有一个要求: 必须返 ...

  5. 如何理解clone对象

    首先明白为什么要用clone? 在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动 ...

  6. 面向对象编程——类和对象

    面向对象编程 类和对象 类(Class):用来描述具有相同属性和方法的对象的集合 class Student:name='stu'#属性def say(self):#方法print("hel ...

  7. Python零基础速成班-第9讲-Python面向对象编程(上),对象和类、初始化、继承、重写、多态、类方法、组合

    Python零基础速成班-第9讲-Python面向对象编程(上),对象和类.初始化.继承.重写.多态.类方法.组合 学习目标 修饰器 面向对象编程:对象和类.初始化.继承.重写.多态.类方法.组合 课 ...

  8. Java—面向对象设计—类和对象

    理解面向对象程序设计 面向对象程序(Object-oriented programming,OOP)设计是继面向过程又一具有里程碑意义的编程思想,是现实世界模型的自然延伸.下面从结构化程序设计说起,逐 ...

  9. python对象可分为什么_Python是面向对象的编程语言,而对象拥有各种特性、功能,专业术语称之为____...

    [综合练习]I took advice on the matter. [单选题]在使用仿制图章工具去除瑕疵时,需结合( )键,才能完成样本的取样. [综合练习]Only a very slight a ...

  10. Java入门姿势【面向对象:1】啥事面向对象、类和对象如何理解

    面向对象是编程开发的一种编程范式. 这次我们来详细了解一下Java面向对象,面向对象的思想已经涉及到软件开发的各个方面,如:面向对象的分析,面向对象的设计.以及我们经常说的面向对象的编程实现 其余的一 ...

最新文章

  1. 网络编程学习笔记(poll函数)
  2. 传智C++课程笔记-1
  3. 中航工业集团金网络(北京)电子商务有限公司副总经理刘正珩:航空“智”造的供应链支撑平台...
  4. Android Studio 导入 AOSP 源码
  5. 在Visual Studio 2017中找不到.NET Framework 4.6.2
  6. 1-7华为HCNA认证eNSP基础B
  7. 外部IC寄存器的位定义
  8. Kubernetes — 监控方案
  9. 记录阿里云增加二级域名步骤[同三级]
  10. Ubuntu 18.04 安装搜狗拼音输入法出现乱码的
  11. 数学概念: 导数和切线方程
  12. 【Python3】作业车间调度,SPT规则,LPT规则
  13. acs代表什么_ACS 是什么意思
  14. python办公自动化 使用openpyxl合并excel表格
  15. ArcGIS导入xyz序列并绘制地形图(含等高线、面体积、点距离的计算)
  16. r导入txt乱码_R中导入excel乱码的解决办法
  17. 危险废物自动化立体仓库设计方案
  18. docker的容器下使用apt-get update卡在[0%] Working问题解决办法
  19. hex文件、out文件、bin文件、map文件解析
  20. Web安全 Acunetix漏洞扫描工具.

热门文章

  1. iOS开发系列--Objective-C之类和对象
  2. python logging 模块之TimedRotatingFileHandler 实现每天一个日志文件
  3. 我怎么感觉js快无敌了~
  4. C程序推算你生日的日期
  5. C#基础之--线程、任务和同步:一、异步委托
  6. MVC源码解析 - UrlRoutingModule / 路由注册
  7. rutime 理解
  8. Discuz! 的编码规范
  9. shiro自定义logout filter
  10. Linux下生产者与消费者问题