php对象克隆clone概述 - 面向对象网 php 学习 对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > PHP > 正文

php对象克隆clone概述

来源: www.bianceng.cn 阅读:

php 对象复制,是复制对象的引用地址,因此使用 $objA = $objB 这种写法时,$objA与$objB会指向相同的内存地址。当$objA 发生变化时,$objB也会受到影响。

如果我们要$objA对象复制为$objB对象,复制之后,$objA有什么变化,都不会影响$objB。即$objA与$objB是两个独立的对象,但$objB的初始值是由$objA创建的,比较高效的做法是使用clone()方法。

$objB = clone $objA;

$objB的值是在$objA基础加$objA事例对象里clone()方法改变后的实例。

当对象被复制后,所有的属性中的引用保持不变,指向原来的变量,如果定义了__clone()方法,则新创建的对象中的__clone()方法会被调用,可用于修改属性的值。

例子1:clone 对象

<?php  
class subclass{  
       
    private $name;  
    private $age;  
       
    public function __construct(){  
        $this->name = 'fdipzone';  
        $this->age = '30';  
    }  
       
    public function __clone(){  
        $this->name = 'xfdipzone';  
        $this->age = '29';  
    }  
       
}  
       
       
class myclass{  
       
    public $p1;  
    public $p2;  
       
    public function __construct(){  
       
    }  
       
    public function __clone(){  
        $this->p1 = clone $this->p1;  
    }  
       
}  
       
$obj = new myclass();  
$obj->p1 = new subclass();  
$obj->p2 = new subclass();  
       
$obj2 = clone $obj;  
       
echo '<pre>';  
echo 'obj<br>';  
var_dump($obj);  
echo '<br>obj2<br>';  
var_dump($obj2);  
echo 'ok';  
echo '</pre>';  
       
?>

上例将输出:

obj  
object(myclass)#1 (2) {  
  ["p1"]=>  
  object(subclass)#2 (2) {  
    ["name":"subclass":private]=>  
    string(8) "fdipzone"
    ["age":"subclass":private]=>  
    string(2) "30"
  }  
  ["p2"]=>  
  object(subclass)#3 (2) {  
    ["name":"subclass":private]=>  
    string(8) "fdipzone"
    ["age":"subclass":private]=>  
    string(2) "30"
  }  
}  
       
obj2  
object(myclass)#4 (2) {  
  ["p1"]=>  
  object(subclass)#5 (2) {  
    ["name":"subclass":private]=>  
    string(9) "xfdipzone"
    ["age":"subclass":private]=>  
    string(2) "29"
  }  
  ["p2"]=>  
  object(subclass)#3 (2) {  
    ["name":"subclass":private]=>  
    string(8) "fdipzone"
    ["age":"subclass":private]=>  
    string(2) "30"
  }  
}

Tags:
相关文章列表: