• 技术文章 >后端开发 >php教程

    PHP编程中的__clone()方法使用详解_PHP

    2016-05-29 11:47:38原创271
    可以在对象类中定义一个__clone()方法来调整对象的克隆行为。此方法的代码将在克隆操作期间执行。除了将所有现有对象成员复制到目标对象之外,还会执行__clone()方法指定的操作。下面修改Corporate_Drone类,增加以下方法:

    function __clone() { 
     $this->tiecolor = "blue";
    }
    

    之后,创建一个新的Corporate_Drone对象,增加employeeid成员的值,克隆这个对象,然后输出一些数据,从而显示克隆对象的tiecolor确实是通过__clone()方法设置的。示例代码:

    <?php
     // Create new corporatedrone object
      $drone1 = new corporatedrone();
     
     // Set the $drone1 employeeid member
      $drone1->setEmployeeID("12345");
     
     // Clone the $drone1 object
      $drone2 = clone $drone1;
     
     // Set the $drone2 employeeid member
      $drone2->setEmployeeID("67890");
     
     // Output the $drone1 and $drone2 employeeid members
      echo "drone1 employeeID: ".$drone1->getEmployeeID()."
    "; echo "drone2 employeeID: ".$drone2->getEmployeeID()."
    "; echo "drone2 tiecolor: ".$drone2->getTiecolor()."
    "; ?>

    程序运行结果

    drone1 employeeID: 12345
    drone2 employeeID: 67890
    drone2 tiecolor:
    

    再来一个小例子:

    <?php
    class Fruit {
     private $name = "水果";
     private $color = "颜色";
     
     public function setName($name){
     $this->name = $name;
     }
     
     public function setColor($color){
     $this->color = $color;
     }
     
     function showColor(){
     return $this->color.'的'.$this->name."
    "; } function __destruct(){ echo "被吃掉了(对象被回收)
    "; } } $apple = new Fruit(); $apple->setName("大苹果"); $apple->setColor("红色"); echo $apple->showColor(); $clone_apple = $apple; $clone_apple->setName("小苹果"); $clone_apple->setColor("青色"); echo $clone_apple->showColor(); ?>

    上面只是将一个类赋值给另一个类,所以此时内存中仍是一个对象。

    <?php
    class Fruit {
     private $name = "水果";
     private $color = "颜色";
     
     public function setName($name){
     $this->name = $name;
     }
     
     public function setColor($color){
     $this->color = $color;
     }
     
     function showColor(){
     return $this->color.'的'.$this->name."
    "; } function __destruct(){ echo "被吃掉了(对象被回收)
    "; } function __clone(){ $this->name = "克隆水果"; } } $apple = new Fruit(); $apple->setName("大苹果"); $apple->setColor("红色"); echo $apple->showColor(); $clone_apple = clone $apple; $clone_apple->setColor("青色"); echo $clone_apple->showColor(); ?>

    clone方法克隆出了一个新的类,所以此时内存中有两个对象。

    php的__clone()方法对一个对象实例进行的浅复制,对象内的基本数值类型进行的是传值复制,而对象内的对象型成员变量,如果不重写__clone方法,显式的clone这个对象成员变量的话,这个成员变量就是传引用复制,而不是生成一个新的对象.如下面一个例子的第28行注释所说

    <?php
      class Account {
        public $balance;
        
        public function __construct($balance) {
          $this->balance = $balance;
        }
      }
     
      class Person {
        private $id;
        private $name;
        private $age;
        public $account;
        
        public function __construct($name, $age, Account $account) {
          $this->name = $name;
          $this->age = $age;
          $this->account = $account;
        }
        
        public function setId($id) {
          $this->id = $id;
        }
        
        public function __clone() {  #复制方法,可在里面定义再clone是进行的操作
          $this->id = 0;
          $this->account = clone $this->account;  #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改
        }
      }
      
      $person = new Person("peter", 15, new Account(1000));
      $person->setId(1);
      $person2 = clone $person;
      
      $person2->account->balance = 250;
      
      var_dump($person, $person2);
      
     ?>
    
    

    输出:

    代码如下:


    object(Person)#1 (4) { ["id":"Person":private]=> int(1) ["name":"Person":private]=> string(5) "peter" ["age":"Person":private]=> int(15) ["account"]=> object(Account)#2 (1) { ["balance"]=> int(1000) } } object(Person)#3 (4) { ["id":"Person":private]=> int(0) ["name":"Person":private]=> string(5) "peter" ["age":"Person":private]=> int(15) ["account"]=> object(Account)#4 (1) { ["balance"]=> int(250) } }

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP __clone()
    上一篇:盘点PHP和ASP.NET的10大对比!_PHP 下一篇:WordPress中使主题支持小工具以及添加插件启用函数_PHP
    PHP编程就业班

    相关文章推荐

    • PHP中SESSION不能跨页传递有关问题的解决方法• php正则表达式印证中文• 做什么项目比较好呢解决办法• thinkphp 没选择上传文件• php-得到小弟我们开始使用php前的一些参数:变量 / 常量 / 模块 / 函数 / 类

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网