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

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

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

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

<?php
class Person {
      public $name;
      function __construct($name="" ) {
                                 $this->name =$name;
      }
     function say()  {
                   echo "我叫:". $this->name ."<br>" ;
      }
}
$Person=new Person( "张三");
 $Person1=clone $Person; //使用clone关键字克隆(复制)对象,创建一个对象的副本
// $Person1=$Person   //这不是复制对象,而是为对象多复制出一个访问该对象的引用
 $Person->say();          //我叫:张三
 $Person1->say();         //我叫:张三
?>

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

if($Person == $Person1){    == 比较的是内容值
             echo "Person和Person1具有相同的类和属性" ;
}else{
     return false;

}

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

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

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

程序结果为false。

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

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

$Person=new Person( "张三");
$Person1=clone $Person;
$Person1-> name=‘李四‘ ;
$Person->say();         我叫:张三
$Person1->say();        我叫:李四

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

__clone()方法

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

<?php
class Person {
       public $name;
       function __construct($name="" ) {
                        $this->name =$name;
        }
       function __clone(){//在对象克隆时自动调用,用来为新对象重新赋值
             $this->name =‘李四‘ ;
        }
        function say()  {
                 echo "我叫:". $this->name ."<br>" ;
        }
}
$Person=new Person( "张三");
 $Person1=clone $Person;
$Person->say();
 $Person1->say();
?>

 总结: __clone() 方法可以当作新对象的构造函数,对新对象做一些初始的修改

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

Object之克隆对象clone 和__clone()函数的相关文章

java克隆对象clone()的使用方法和作用

转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本地副本.这也是本地副本最常见的一种用途.若决定制作一个本地副本.仅仅需简单地使用clone()方法就可以.Clone是"克隆"的意思,即制作全然一模一样的副本.这种方法在基础类Object中定义成"protected"(受保护)模式. 但在希望克隆的不论什么衍生类中,必

克隆对象clone

在PHP中可以根据现有的对象克隆初一个完全一样的对象,克隆以后,原本和副本两个对象完全独立,互不干扰. <?php class person{ private $name; private $sex; private $age; function __construct($name="",$sex="",$age=""){ $this->name=$name; $this->sex=$sex; $this->age=$ag

Java Object类中的-----------clone()克隆机制

package java_lang_object; public class User implements Cloneable { public Address address; public int age; public String name; public User(int age,String name){ this.age = age; this.name = name; this.address = new Address("广州天河"); } public  User

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

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

Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么要对对象进行克隆.Java中所有的对象都是保存在堆中,而堆是供全局共享的.也就是说,如果同一个Java程序的不同方法,只要能拿到某个对象的引用,引用者就可以随意的修改对象的内部数据(前提是这个对象的内部数据通过get/set方法曝露出来).有的时候,我们编写的代码想让调用者只获得该对象的一个拷贝(也

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

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

深度克隆对象

有时,我们需要对一个对象进行复制,如下列要求: 1. 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝 2. 被复制的对象类型会被限制为数字.字符串.布尔.日期.数组.Object对象. <script> function isObject(obj){ if(Object.prototype.toString.call(obj)==='[object Array]' || Object.prototype.toString.call(obj)==='[object Objec

php面向对象之克隆对象

在前面的PHP面向对象之对象和引用,我们试图以"$b=$a"的方式复制对象以传递对象的值(内容),结果却是传递对象的地址,在结尾为了解决复制对象这个问题,提到了克隆的方法.接下来讲一下php面向对象之克隆对象. 前面我们已经知道,使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在PHP中可以根据现在的对象来克隆出一个完全一样的对象,克隆出来的副本和原本两个对象完全独立而互不干扰. 对象克隆 在php中使用"c

面向对象:输出对象、克隆对象、加载类

1.__tostring()能够直接输出对象 class ren { public $name; function run() { echo"跑"; } function __tostring() { return"name变量代表的是人员名称,run方法是一个跑的方法"; } } $r=new ren(); echo $r; 2.克隆对象__clone() class ren { public $name; function run() { echo"跑