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

(⊙_⊙)

在开始使用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的使用方法了=。=。。。
如果错误请给予指出,谢谢~

php之clone 复制对象以及__clone魔术方法相关推荐

  1. JavaScript 复制对象与Object.assign方法无法实现深复制

    在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...

  2. php 对象 final,PHP7_OOP_对象重载以及魔术方法_对象遍历_final关键字

    //对象遍历: class MyClass{ public $var1 = "value 1"; public $var2 = "value 2"; publi ...

  3. PHP面向对象常见的关键字和魔术方法

    在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...

  4. php对象魔术方法,php学习之类与对象的魔术方法的使用

    原标题:php学习之类与对象的魔术方法的使用 魔术方法有哪些 __construct:构造方法 __destuct:析构方法 __call:在对象中调用一个不可访问的方法时.__call()会被调用 ...

  5. php 魔术方法 说明

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的. ◆__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名. ◆_ ...

  6. php 5.3 construct_PHP 5.3新增魔术方法__invoke概述

    PHP自从5.3版以来就新增了一个叫做__invoke的魔术方法,使用该方法就可以在创建实例后,直接调用对象.如下示例所示: class testClass { public function __i ...

  7. PHP中的常见魔术方法功能作用及用法实例

    这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)_ ...

  8. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __uns

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 __get( $property ) 当调用一个未定义的属性时访问此方法 __set( $property, $va ...

  9. php 魔术方法__get,php常用魔术方法

    1.构造函数__construct()和析构函数__desctruct()分别在对象创建和销毁时被调用.对象被"销毁"是指不存在任何对该对象的引用,比如引用该对象的变量被删除(un ...

最新文章

  1. HDLBits 系列(0)专题目录
  2. 【题解】 SP5973 SELTEAM - Selecting Teams
  3. golang 不定参 可变参 使用 传递
  4. Caffe下自己的数据训练和测试
  5. Html 教程 (9)列表
  6. poj2464扫描线好题,树状数组解法
  7. 百般受虐!“波士屯动力”机器人这一次枪口对准人类
  8. Mybatis(15)Mybatis延迟加载/缓存
  9. 多元正态分布的后验采样(包含程序)
  10. 红外传感器的基础知识
  11. Ubuntu安装时,下载太慢怎么办
  12. class文件的加载过程
  13. 【JS-05】javascript检测ie版本
  14. 概率论复习笔记二——离散型分布和连续型分布
  15. 光猫路由器与交换机的连接方式
  16. gbase 8d客户端连接注意事项
  17. useradd命令的一些基本操作
  18. 华为校招 java 面试题
  19. 英特尔迅驰二代风尚盛典亲身体验
  20. 信息安全政策(等级保护、分级保护)

热门文章

  1. ASP.NET Core中使用令牌桶限流
  2. 数据写入规则IBufferWriterT
  3. 推荐:适合小白入门的Asp.Net Core 开源学习手册
  4. redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
  5. 集成平台集群任务动态分派
  6. 参加首届中国 .NET 开发者峰会有感
  7. Exceptionless使用介绍
  8. 通过Blazor使用C#开发SPA单页面应用程序(1)
  9. 从壹开始 [ Ids4实战 ] 之三║ 详解授权持久化 用户数据迁移
  10. DevOps/.NET 微服务 秋季分享会领优惠门票