>  기사  >  php教程  >  php克隆对象clone的使用方法

php克隆对象clone的使用方法

WBOY
WBOY원래의
2016-06-06 19:55:561196검색

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 在PHP5中,对象间的赋值被默认视为地址引用,例如: ?php $objB = $objA; ? 针对上面这句代码,我们看一下内存分配结构: 从上面示意图中我们可以看出,定义$objA对象时,系统会为其分配一块内存(①

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入

  在PHP5中,对象间的赋值被默认视为地址引用,例如:

  

  $objB = $objA;

  ?>

  针对上面这句代码,我们看一下内存分配结构:

  从上面示意图中我们可以看出,定义$objA对象时,系统会为其分配一块内存(①箭头),当$objB被赋值$objA时,系统没有再分配内存,而是将$objB的引用直接指向了$objA内存,实际上这两个对象指向的是同一块内存,这时,当我们修改$objB的值时,$objA的值也跟着变化了,这就使得如果我们需要两个同样的、相对独立的对象就需要分别定义,操作麻烦,而且程序的可读行定也不好。为了解决这个问题,PHP为我们提供了一种可以克隆对象的方法clone,在PHP手册里对clone方法介绍的比较简单,下面UncleToo用实例为大家介绍一下clone方法的使用。

  示例一:

  

  class subclass{

  private $name;

  private $age;

  public function __construct(){

  $this->name = '张三';

  $this->age = '30';

  }

  public function __clone(){

  $this->name = '李四';

  $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 '

';
<p>  echo '这是obj<br>';</p>
<p>  var_dump($obj);</p>
<p>  echo '-----------------------';</p>
<p>  echo '<br>这是obj2<br>';</p>
<p>  var_dump($obj2);</p>
<p>  echo '</p>
';

  ?>

  输出:

  这是objobject(myclass)#1 (2) {

  ["p1"]=>

  object(subclass)#2 (2) {

  ["name":"subclass":private]=>

  string(4) "张三"

  ["age":"subclass":private]=>

  string(2) "30"

  }

  ["p2"]=>

  object(subclass)#3 (2) {

  ["name":"subclass":private]=>

  string(4) "张三"

  ["age":"subclass":private]=>

  string(2) "30"

  }

  }

  -----------------------这是obj2object(myclass)#4 (2) {

  ["p1"]=>

  object(subclass)#5 (2) {

  ["name":"subclass":private]=>

  string(4) "李四"

  ["age":"subclass":private]=>

  string(2) "29"

  }

  ["p2"]=>

  object(subclass)#3 (2) {

  ["name":"subclass":private]=>

  string(4) "张三"

  ["age":"subclass":private]=>

  string(2) "30"

  }

  }

  可以看到,$obj2 clone $obj,$obj->p1 clone $obj->p1,执行了 __clone()方法。而在__clone方法中,对p1的name与 age属性进行修改,因此p1的name与age 发生变化。而p2因为没有执行clone()方法,所以新复制出来的$obj2->p2的属性与 $obj->p2一样。

[1] [2] 

php克隆对象clone的使用方法

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.