php之clone 复制对象以及__clone魔术方法

如果错误和不足请给予指出,谢谢~

(⊙_⊙)

在开始使用clone之前我们下先看以下一个小例子:

<?php 
//首先定义一个test一个类
class Testclass {//成员变量是$value1public $value1;
}
//随后new一个obj1
$obj1 = new Testclass();
//复制成员变量的值为qqq
$obj1->value1 = "qqq";
//我们使用赋值符号给左边obj2赋值obj1
$obj2 = $obj1;
//我们在这里把obj2的的value1复制为eee
$obj2->value1 ="eee";     
//随后我们打印出两者的值
var_dump($obj1);
echo '<br/>';
var_dump($obj2);

为了查看方便,我把那个解释写在了注释=。=。(这句话总感觉怪怪的)

我们运行一下,发现如下结果:
运行结果

是不是两者的值都是一样的?
那是因为(借用php手册的话就是):当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

其实在这里就是obj1给了obj2它的地址,就和引用一样,obj2指向了obj1,所以导致两者所执行的操作将会收到影响。那么该如何解决这样情况呢?当然是使用clone了;列如下代码:

<?php 
//首先定义一个test一个类
class Testclass {//成员变量是$value1public $value1;
}
//随后new一个obj1
$obj1 = new Testclass();
//复制成员变量的值为qqq
$obj1->value1 = "qqq";
//在这里我们使用clone来赋值obj1
$obj2 =clone $obj1;
//我们在这里把obj2的的value1复制为eee
$obj2->value1 ="eee";     
//随后我们打印出两者的值
var_dump($obj1);
echo '<br/>';
var_dump($obj2);

注意看这一段代码:

$obj2 =clone $obj1;

在这里使用了clone,这样就会没事了,看如下运行结果:
运行结果

是否发现两者并没有相互影响呢?

好了,在这里已经完成了基本的clone的讲解了,现在我们来深入一下(抽根烟压压惊。。。 ( ´´ิ∀´ิ` ) )

我们接下来看看一个例子:

<?php 
//首先定义一个test一个类
class Testclass {//成员变量是$value1public $value1;
}
//在这里是定义了一个变量
$vlaue_1='bbj';
//随后new一个obj1
$obj1 = new Testclass();
//引用value_1的值,注意,是引用
$obj1->value1 = &$vlaue_1;
//在这里我们使用clone来赋值obj1
$obj2 =clone $obj1;
//我们在这里把obj2的的value1复制为eee
$obj2->value1 ="eee";     
//随后我们打印出两者的值
var_dump($obj1);
echo '<br/>';
var_dump($obj2);

我们的代码和之前的差不多,我们主要看这一行:

//引用value_1的值,注意,是引用
$obj1->value1 = &$vlaue_1;

注意在此是引用哟。
我们看下运行结果:
运行结果
是否发现我在obj2改变了value1值之后obj1的值也会改变?因为在这里obj1赋值成员变量的时候使用了&取址。将会成为一个引用的状态。那么我们如果想要把这个值不守clone出来的对象的值影响该怎么办呢?

那么在这里我们只需要在此clone一下这个成员变量就好了,该如何clone了?那么我们现在就可以使用我们的魔法方法__clone了。

首先我们来说说__clone()在什么状态下触发:

当我们有clone操作的时候将会除非这个类里面的__clone方法。那么把我们的成员变量在__clone方法里面clone一下就好了,如下代码演示:
注:clone只能用于对象克隆,对象复制。记住,如果你clone一个非对象变量将会报错no obj。。。
以下例子是我从网上找的一个例子,感觉不错,这里将用这个例子来讲解魔法方法__clone的使用:
本来这个是没有注释的,我顺便把解释丢到了里面,这样强制clone后就不会指向原来的对象了。

<?php 
class testClass
{public $str_data;//这里是一个非对象类型public $obj_data;//在这里这是一个对象,可以看下面将会给一个对象给他
//使用clone的时候触发public function __clone() {$this->obj_data = clone $this->obj_data;//这个对象将会被克隆,会被强制复制,这样就不会指向原来的对象了}
}
//new一个datatime对给datatimeobj
$dateTimeObj = new DateTime("2014-07-05", new DateTimeZone("UTC"));$obj1 = new testClass();//new一个testclass
$obj1->str_data ="aaa"; //复制aaa
$obj1->obj_data = $dateTimeObj; //给obj_data一个对象datetimeobj$obj2 = clone $obj1; //克隆obj1给obj2
var_dump($obj1);  // str_data:"aaa"  obj_data:"2014-07-05 00:00:00"
var_dump($obj2);  // str_data:"aaa"  obj_data:"2014-07-05 00:00:00"
$obj2->str_data ="bbb"; //obj2给一个值bbb给strdata
$obj2->obj_data->add(new DateInterval('P10D'));//objdata改变objdata的值var_dump($obj1);  // str_data:"aaa"  obj_data:"2014-07-05 00:00:00"
var_dump($obj2);  // str_data:"aaa"  obj_data:"2014-07-15 00:00:00"
var_dump($dateTimeObj);  //"2014-07-05 00:00:00"

以上就是clone的使用方法了=。=。。。
如果错误请给予指出,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java语言中的浮点型数据分为,Java语言中的浮点型数据根据数据存储长度和数值精度的不同,进一步分为float型和double型,其中dou...

Java语言中的浮点型数据根据数据存储长度和数值精度的不同&#xff0c;进一步分为float型和double型&#xff0c;其中dou更多相关问题【单选题】下列因素中不是经济中内在稳定器的是【单选题】外在时滞是以下哪两者之间的时间&#xff1a;【单选题】当经济中存在失业时&#xf…

python查看图片的源代码_python实现图片筛选程序

今天因工作需要写了个小程序&#xff0c;用于在图片集中自动抽取需要的照片。该程序只是实现了基本功能&#xff0c;还有很多需要完善的地方&#xff0c;展示出来算是给自己鼓鼓气吧。该程序应用有一定特殊条件&#xff0c;因我选择的图片集是工业生产过程中自动拍摄生成的&…

C#中使用WeiFenLuo.WinFormsUI.Docking.dll实现窗口停靠效果

很酷的效果&#xff0c;很值得好好去学习的哈。 重置工具箱&#xff1a; 新建一个WinForm程序,项目名称为TestDockPanelControl。选中Form1窗体后选择工具箱--->>新建个添加选项卡命名为WeiFenLuo--->>右键--->>选择项--->>浏览--- >>weiFenLuo.…

使用aspnetcore前后端分离开发,你一定要知道这个。

前言用过Vue单页面应用开发的&#xff0c;一定都知道Vue-router这个路由组件&#xff0c;它支持hash和history两种模式。HTML5 History 模式vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL&#xff0c;于是当 URL 改变时&#xff0c;页面不会重新加载。…

Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结

Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件。 1 2. 使用Class静态方法 Class.forName 1 2.1. 使用ClassLoader 1 2.2. 3. 直接new 2 3. Ref 2 1. 动态加载jar文件和class文件。 完成…

剑指offer之找到链表里面包含环的入口节点

1 问题 剑指offer之找到链表里面包含环的入口节点&#xff0c;比如 // node7<-node6 <-node5// | |//head->node1->node2->node3->node4 环的入口节点是node2 2 代码实现 #include <stdio.h> #include <s…

Visual Studio 2015专业版创建Win32控制台应用程序,C,C++源文件

原配的Visual Studio 2015专业版不像之前的版本,在新建项目里面是找不到Win32模板的,那么怎么才能新建Win32项目和Win32控制台应用程序呢?今天我就带大家做一简单介绍。 先看如下图所示: 解决: 1、添加的办法是点击上图所示的新建项目界面的Visual C++下面的Windows,再…

php 序列化对象

习惯性借用手册里面的介绍&#xff1a; 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。序列化一个对象将会保存对象的所有变量&#xff0c;但是不会保存对象的方法&#xff0c;只会保存类…

php html标签自定义属性,详解H5的自定义属性data-*

HTML5 增加了一项新功能是 自定义数据属性 &#xff0c;也就是 data-* 自定义属性。在HTML5中我们可以使用以 data- 为前缀来设置我们需要的自定义属性&#xff0c;来进行一些数据的存放当然高级浏览器下可通过脚本进行定义和数据存取。在项目实践中非常有用。例如&#xff1a;…

cdoj 1131 男神的礼物 区间dp

男神的礼物 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1131 Description Lweb学长是集训队里公认的男神。有一天他要给美美的学姐姐准备礼物。Lweb学长可是会魔法的哟。为了准备一份礼物&#xff0c;男神要加工n份材料。每一次…

如何为同一 DTO 属性指定 2 个名称

前言我们在《实现DDD领域驱动设计》中谈到过输出 DTO 的最佳实践&#xff0c;其中一条是&#xff1a;保持输出 DTO 数量最少&#xff0c;尽可能重用。但是&#xff0c;对于 2 个不同接口输出的同一 DTO 属性&#xff0c;客户端可能需要对应不同的名称&#xff0c;比如&#xff…

HDU 4777 Rabbit Kingdom 树状数组

分析&#xff1a;找到每一个点的左边离他最近的不互质数&#xff0c;记录下标(L数组)&#xff0c;右边一样如此&#xff08;R数组&#xff09;&#xff0c;预处理 这个过程需要分解质因数O&#xff08;n*sqrt(n)) 然后离线&#xff0c;按照区间右端点排序 然后扫一遍&#xff0…

按一行一行的方法将一个文本文件复制到另一个文件中_命令行技巧:分割文件内容...

(给Linux爱好者加星标&#xff0c;提升Linux技能)英文&#xff1a;Stephen Snow&#xff0c;翻译&#xff1a;Linux中国/MjSevenlinux.cn/article-10809-1.htmlFedora 发行版是一个功能齐全的操作系统&#xff0c;有出色的图形化桌面环境。用户可以很容易地通过单击动作来完成任…

java:遍历

import java.util.ArrayList;import java.util.Iterator;import java.util.List;/*** 遍历数组四种方法*/class Test {/*** 注&#xff1a;Iterator 迭代器*/public static void main(String[] args) {Test1 t new Test1();Test1 t1 new Test1();List list new ArrayList();…

谷歌浏览器之如何调试页面js

1 问题 谷歌浏览器如果调试页面js 2 举例子 比如我们需要调试www.baidu.com这个页面&#xff0c;我们需要先按下F12&#xff0c;然后再去点击Source,然后在找到相应的js文件&#xff0c;在左边进行打上断点&#xff0c;然后我们再刷新页面&#xff0c;然后我们在右边可以看到…

Matlab 2016b+TimeSat 3.1中文经典安装及使用教程(附下载地址)

本教程为博主刘一哥GIS原创,坚决打击侵权行为,严禁抄袭!!! 目录 一、Matlab2016b下载及安装 二、TimeSat 3.1软件安装 三、TimeSat 3.1软件的使用和说明详解

对象比较 ===三个等于号

可能这是我博客里面最短的博文了。 有关三个等于号的用法。。。 我在这个分类里只是记录一下php中少见的东西&#xff0c;或者说是php中书上不是太过详细介绍的东西。 那么我在这里直接引用php手册里面的内容吧&#xff0c;很简单&#xff1a;当使用比较运算符&#xff08;&…

php判断秒为两位数,判“新”函数:得到今天与明天的秒数

判“新”函数&#xff1a;得到今天与明天的秒数更新时间&#xff1a;2006年10月09日 00:00:00 作者&#xff1a;如果你想根据时间来判断某一时间值(用秒数表示)是否在今天的范围之内。下面这个函数&#xff0c;将帮你轻而易举的判断。函数源代码&#xff1a;----------------…

如何查看文件夹里有几张图片_如何把几张图片合成一个pdf?图片合并为pdf的操作教程...

我在一家公司当美工&#xff0c;平时要接触到很多图片素材&#xff0c;并把它们以pdf格式文件的形式发送给客户查看(以此来摸索出客户想要的图片效果)。把几张图片合并成为一个pdf文件&#xff0c;即是将图片格式转换成为pdf格式&#xff0c;这对我来说不难操作。毕竟是公司的老…

HDU - 4734 F(x) (2013成都网络游戏,数字DP)

意甲冠军&#xff1a;求0-B见面<F[A]所有可能的 思维&#xff1a;数字DP&#xff0c;内存搜索 #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std;int A, B; int dp[20][200000]; int bit[20];i…