php 克隆 __clone

php 克隆 clone

在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。

在php语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。

核心:

$obj = new MyCloneable();

$obj2 = clone $obj;

所有的属性中的引用 仍然不变,指向原来的变量。

class ByRef
{
    var $prop;
    function __construct()
     {
        $this->prop =& $this->prop;//&地址引用 指向同一个内存地址
         $this->prop1 = ‘haha, i am here‘;
    }
     function __clone()
    {
            $this->prop=2;// $a->prop is now 2
    }
}
$a = new ByRef;
$a->prop = 1;
echo ‘原对象: ‘;var_dump($a);echo ‘<br><br>‘;

$b = clone $a;//本句替换成 $b=$a,结果也还是3,不过不会触发ByRef::__clone, prop不会中间变成2。本例研究的是克隆后,$b->prop引用不变
echo ‘原对象: ‘;var_dump($a);echo ‘<br>‘;
echo ‘clone 对象: ‘;var_dump($b);echo ‘<br><br>‘;
$b->prop = 3; // $a->prop is now 3
$b->prop1 = ‘oh,u move‘; // b的prop1 改变了,a的prop1没变
echo ‘原对象: ‘;var_dump($a);echo ‘<br>‘;
echo ‘clone 对象: ‘;var_dump($b);echo ‘<br><br>‘;
echo ‘原对象的引用prop: ‘;echo $a->prop;echo ‘<br>‘;
echo ‘clone 对象的引用prop: ‘;echo $b->prop;

###################结果###################

原对象: object(ByRef)#6 (2) { ["prop"]=> &int(1) ["prop1"]=> string(15) "haha, i am here" }

原对象: object(ByRef)#6 (2) { ["prop"]=>
&int(2) ["prop1"]=> string(15)
"haha, i am here" }

clone 对象: object(ByRef)#7 (2) { ["prop"]=>
&int(2) ["prop1"]=> string(15)
"haha, i am here" }

原对象: object(ByRef)#6 (2) { ["prop"]=>
&int(3) ["prop1"]=> string(15)
"haha, i am here" }

clone 对象: object(ByRef)#7 (2) { ["prop"]=>
&int(3) ["prop1"]=> string(9) "oh,u
move" }

原对象的引用prop: 3

clone 对象的引用prop: 3

转http://blog.sina.com.cn/s/blog_54e38bdc0100xhm7.html

时间: 2024-10-08 03:11:26

php 克隆 __clone的相关文章

php -- 魔术方法 之 对象克隆 : __clone()

产生对象的方法: 1.从类产生对象.new,通过new去堆区开辟一块内存空间 2.从对象产生对象.clone,通过关键字clone,将一个对象完整的复制一份,新开辟一块内存空间,将复制的结果存放到该内存里面 语法:新对象(变量) = clone 老对象(变量) 对象克隆:__clone() 当一个对象被clone的时候,被克隆的对象会自动调用__clone()方法,克隆方法不走构造方法 <?php //对象克隆 class Person{ //属性 public $name; private $

PHP魔术方法以及关于独立实例与相连实例的讲解

<?php //魔术方法 //当包含多个类 //1.自动装载类的魔术方法__autoload() function __autoload($classname){ if (isset($classname)){ require_once $classname.'.class.php'; } } /* $computer1=new Computer(); $computer1->addList('dalisng',234); echo $computer1; */ //__call()屏蔽调用方

面向对象小结

## 典型例子```//一个典型的类class Person{    //注意这里用var定义,未确定用哪个关键词(protected,private,public)来修饰    var $name ;     //构造函数,    function __construct($name){        //通过构造函数传参来给类中的属性赋值        $this->name = $name;    }        //说话这个方法    function say(){        ec

访问修饰限定符的简单总结、final/abstruct/interface对类的限制、自动加载机制、序列化与反序列化【数据持久化和对象的序列化问题】、对象的拷贝(按引用是因为对象标识)和克隆(__clone方法中的this指向)

1.针对访问修饰限定符的理解只需要两点:(1)针对的是类的概念和访问代码的位置来确定是否能够访问(2)对访问修饰限定符的使用时只需要对该成员的使用场景注意即可[也就是内部,继承类,外部进行访问的权限] 不需要对内部进行太多理解[需要对php底层理解时进行理解] [重点][用途]通过访问修饰限定符将内部成员的权限合理的限制,然后再使用公共接口来调用这个基本服务,保证外部不能访问其内部的构件[这样既能够通过类内的设置,将内部的功能实现更好的限制,只有最外层的接口可以正常被访问到,而不了解内部的业务]

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

在前面的PHP面向对象之对象和引用,"$b=$a"的方式复制对象传递的是对象的地址,而不是传递对象的值(内容),我们可以通过克隆对象来实现对对象的内容和引用的复制 使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在PHP中可以根据现在的对象来克隆出一个完全一样的对象,克隆出来的副本和原本两个对象完全独立而互不干扰 在php中使用"clone"关键字来克隆对象 <?php class Perso

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

有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰. 在PHP4中我们使用“clone”这个关键字克隆对象: <? class Person { // 下面是人的成员属性 var $name; // 人的名子 var $sex; // 人的性别 var $age; // 人的年龄 // 定义一个构造方法

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

有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰. 在PHP4中我们使用“clone”这个关键字克隆对象: <? class Person { //下面是人的成员属性 var $name; //人的名子 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为属性

0607pm克隆&amp;引用类&amp;加载类&amp;面向对象串讲&amp;函数重载

克隆class Ren{ public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this->sex=$s; } function __clone()//改变克隆的对象内容 { $this->name="李思思";//this代表复本对象 $that->name="李思思";//that代表原本的,后来废弃了 }}$r=new Ren("张丹

克隆、加载类

1.克隆关键词:clone class Ren{ public $name; public $sex; function __construct($n,$s)  //构造方法,设置初始值 { $this->name=$n; $this->sex = $s; } function __clone()    //创建克隆方法,即对克隆体进行操作 { $this->name = "李四"; //this代表的是复本对象 //$that->name = "li