在前面的PHP面向对象之对象和引用,我们试图以"$b=$a"的方式复制对象以传递对象的值(内容),结果却是传递对象的地址,在结尾为了解决复制对象这个问题,提到了克隆的方法。接下来讲一下php面向对象之克隆对象

前面我们已经知道,使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在PHP中可以根据现在的对象来克隆出一个完全一样的对象,克隆出来的副本和原本两个对象完全独立而互不干扰。

对象克隆

在php中使用"clone"关键字来克隆对象。

01 <?php
02      class Person { 
03           public $name
04                                                                                                        
05           function __construct($name="" ) {
06                $this->name =$name;
07                                                                                                                   
08           }
09           function say()  {    
10                echo "我叫:"$this->name ."<br>" ;
11           }
12      }
13      $Person=new Person( "张三"); 
14      $Person1=clone $Person//使用clone关键字克隆(复制)对象,创建一个对象的副本
15     // $Person1=$Person   //这不是复制对象,而是为对象多复制出一个访问该对象的引用
16      $Person->say();                    
17      $Person1->say();                    
18                                                                                                           
19 ?>

上面程序运行结果为:

我叫:张三

我叫:张三

克隆的副本和原本拥有相同的类和属性

1 if($Person == $Person1){
2        echo "Person和Person1具有相同的类和属性" ;
3 }else{
4        return false;
5 }

程序输出:Person和Person1具有相同的类和属性

克隆的副本和原本存储在不相同的位置

1 if ($Person === $Person1){
2        echo "Person和Person1具有相同的类和属性且存储在相同的位置" ;
3 else{
4        return false ;
5 }

程序结果为false。

克隆的副本和原本独立而互不干扰

我们来改变一下原本的属性值,看一下有什么影响

1 $Person=new Person( "张三"); 
2      $Person1=clone $Person;                 
3      $Person1-> name='李四' ;
4      $Person->say();                    
5      $Person1->say();

程序运行结果为:

我叫:张三

我叫:李四

由此可知,克隆出来的副本和原本两个对象完全独立而互不干扰。

__clone()方法

如果需要为克隆后的副本对象克隆时重新为成员属性赋值,可以在类中声明一个魔术方法"__clone"

01 <?php
02      class Person { 
03           public $name
04                              
05           function __construct($name="" ) {
06                $this->name =$name;
07                                         
08           }
09           function __clone(){//在对象克隆时自动调用,用来为新对象重新赋值
10              $this->name ='李四' ;
11           }
12           function say()  {    
13                echo "我叫:"$this->name ."<br>" ;
14           }
15      }
16      $Person=new Person( "张三");
17      $Person1=clone $Person;                
18      $Person->say();                   
19      $Person1->say();                   
20                                 
21 ?>

程序运行结果为:

我叫:张三

我叫:李四

php面向对象之克隆对象的更多相关文章

  1. PHP面向对象(OOP):克隆对象__clone()方法

    有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象, ...

  2. 【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法

    有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象, ...

  3. Object之克隆对象clone 和__clone()函数

    在前面的PHP面向对象之对象和引用,"$b=$a"的方式复制对象传递的是对象的地址,而不是传递对象的值(内容),我们可以通过克隆对象来实现对对象的内容和引用的复制 使用传址引用的方 ...

  4. 1.__tostring()这个方法在类里可以直接输出对象。2.克隆对象的运用

    <?php //__tostring()这个方法在类里的用途 能够直接输出对象 class Ren { public $name; function Run() { echo "跑&q ...

  5. javascript最新深度克隆对象方法

    javascript最新深度克隆对象方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  6. sdut 上机练习8面向对象编程(对象的数组)

    上机练习8面向对象编程(对象的数组) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 利用类对象数组完毕N个学生数据(学号是字符串类型.成绩是整型)的输入 ...

  7. java基础面向对象之类与对象

    java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...

  8. Perl面向对象(2):对象

    本系列: Perl面向对象(1):从代码复用开始 Perl面向对象(2):对象 Perl面向对象(3):解构--对象销毁 第3篇依赖于第2篇,第2篇依赖于1篇. 已有的代码结构 现在有父类Animal ...

  9. js深度克隆对象

    js深度克隆对象 js深度克隆对象简单的记录一下,如下代码: var obj = { typeOf: function(obj) { const toString = Object.prototype ...

随机推荐

  1. Spring MVC多项单选按钮

    以下示例显示如何在使用Spring Web MVC框架的表单中使用多选按钮(RadioButton).首先使用Eclipse IDE来创建一个WEB工程,实现一个让用户可选择自己喜欢的数字的功能.并按 ...

  2. Laravel使用ORM操作数据

    数据表 CREATE TABLE IF NOT EXISTS students( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NO ...

  3. PHP和Java 加解密

    http://www.jb51.net/article/64961.htm http://www.jb51.net/article/129218.htm http://www.jb51.net/art ...

  4. xpath与css基本使用方法

    path使用方法 1.工具Firefox50版本以下,安装插件firebug.firepath

  5. PHP实现对短信验证码发送次数的限制(防机刷验证码)

    PHP实现对短信验证码发送限制(防止机刷验证码) 对用户获取短信验证码的手机号.ip.和浏览器(使用唯一标识)进行限制.本文介绍的方法是对用户每天只能通过同一浏览器或同一ip地址获取验证码10次或者同 ...

  6. mysql with python

    前言: 数据库为人类解决了三大问题:持久化存储.优化读写.数据标准化. MySQL它不是数据库,它是管理数据库的软件.MySQL管理了很多数据库.是典型的服务型数据库,需要TCP/IP去连接. MyS ...

  7. 【BZOJ1912】[Apio2010]patrol 巡逻 树形DP

    [BZOJ1912][Apio2010]patrol 巡逻 Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示 ...

  8. 关于webpack打包js和css

    废话不多说,直接贴出代码,大家瞅瞅:其中要引用css的话是要用css-loader.用了之后再webpack.config.js里面配置相应的代码,并且在相应的js文件里面引用即可啦,不知道有哪位大神 ...

  9. delphi局域网Ping各主机方法及设置本地ip方法

    1. 首先引用winsock单元 function PingHost(HostIP: String): Boolean; type PIPOptionInformation=^TIPOptionInf ...

  10. java NIO 模型(一)

    1. 阻塞I/O通信模型 1.性能:一连接一线程模型导致服务端的并发接入数和系统吞吐量受到极大限制 2.可靠性:由于IO操作采用同步阻塞模式,当网络拥塞或者逻辑处理缓慢会导致IO线程被挂住,阻塞时间无 ...