跳转到主内容
极星编程网:以代码为星,赴技术山海!

php克隆对象clone的使用方法

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

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

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

  echo '这是obj
';

  var_dump($obj);

  echo '-----------------------';

  echo '
这是obj2
';

  var_dump($obj2);

  echo '

'; ?> 输出: 这是objobject(myclass)#1 (2) { PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 ["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]

相关文章