`

PHP5的__clone实现深复制

    博客分类:
  • php
 
阅读更多

 

<?php
	class cb{
		var $mb; 
	}
	class ca {
		var  $ma;
		var $b;   
		function __construct($ma, $mb) {
			$this->ma = $ma;
			$this->b = new cb(); 
			$this->b->mb = $mb;  
		}
		function __clone() {
			$this->b = clone $this->b; 
		}
	}
	
	$a = new ca(1, 1);
	$b = clone  $a;
	$b->b->mb = 2;  
	print $b->b->mb."\n";
	print $a->b->mb."\n";
?>

 输出结果为:

 

2

1

 

而如果把__clone函数里的这一行

$this->b = clone $this->b;

注释掉的话,结果就是:

2

2

 

可见,需要在__clone函数里对类里的对象进行一遍clone以实现深复制。

分享到:
评论

相关推荐

    PHP对象的浅复制与深复制的实例详解

    PHP对象的浅复制与深复制的实例详解 最近在看原型模式时注意到这个问题~~PHP中对象 ... //只有实现了下面方法聚合类 才能实现深复制 /*function __clone() { $this-&gt;objB = clone $this-&gt;objB; }*/ } class ObjB {

    PHP5学习教程.chm

    `clone`关键字用于创建对象的深复制,这对于避免共享对象状态至关重要。 5. **Zend引擎的发展**: Zend引擎是PHP的底层解释器,负责解析和执行PHP代码。在PHP5中,Zend引擎进行了重大改进,支持了OOP特性,并提升...

    php代码-PHP中的克隆

    当克隆`$complex`时,通过在`__clone()`方法中调用`clone $this-&gt;innerObject`,我们确保了内部对象也被克隆,从而实现了深复制。 总的来说,PHP中的克隆机制是实现对象独立性的重要工具,它在许多场景下都能发挥...

    深入php面向对象、模式与实践.pdf

    - 为了实现深复制,可以重写 `__clone()` 方法,在克隆对象之前对属性进行逐个复制,确保所有嵌套的对象也得到独立的副本。 2. **引用传递(&)** - 使用 `&` 符号可以传递变量的引用,而不是其值的副本。这样,...

    PHP5面向对象编程电子教程

    4. 对象的复制:PHP5提供了`clone`关键字,用于创建一个现有对象的副本。 5. 接口(Interface)与抽象类(Abstract Class):接口定义了一组必须被实现的方法,而抽象类可以包含抽象方法(无具体实现)和具体方法。...

    DeepCopy:创建对象的深层副本(克隆)

    深度复制DeepCopy可帮助您创建对象的深层副本(克隆)。 它旨在处理关联图中的循环。目录如何? 使用Composer安装: composer require myclabs/deep-copy 简单使用: use DeepCopy \ DeepCopy ;$ copier = new ...

    DeepCopy:创建对象的深层副本(克隆)-开源

    您使用 __clone() 并自己实现该行为。 DeepCopy 递归遍历对象的所有属性并克隆它们。 为了避免克隆同一个对象两次,它保留了所有实例的哈希图,从而保留了对象图。 或者,您可以创建自己的 DeepCopy 实例以对其进行...

    深入php面向对象、模式与实践.docx

    为了解决这个问题,可以使用`__clone()`魔术方法,在克隆之前对对象属性进行深度复制。 2. **引用传递(Passing by Reference)**: 使用`&`符号,我们可以传递方法参数的引用,这意味着在函数内部对参数的修改会...

    学习php设计模式 php实现原型模式(prototype)

    2. **具体原型(Concrete Prototype)角色**:实现了抽象原型接口,提供了一个克隆自身的方法,通常使用PHP的`__clone`魔术方法来实现。 ### 三、原型模式的优点与缺点 **优点**: 1. 运行时动态创建对象,增加...

    php面向对象中的魔术方法中文说明

    7. **__clone()**: 在使用 `clone` 关键字复制对象时,`__clone()` 方法会被调用,允许开发者自定义复制过程中的行为,比如深拷贝某些属性。 8. **__sleep()**: 在对象进行序列化(`serialize()`)前,`__sleep()` ...

    php-poo-2:紧急情况下的Aula de Tecnologias | 阿尔法学院

    7. 对象克隆(Clone):创建对象的一个副本,通常用于复制对象状态。 8. __get(), __set(), __isset(), __unset(): 提供对未定义属性的操作,实现魔术方法。 通过学习这些内容,开发者将能更好地理解和应用PHP的OOP...

    php设计模式之原型模式分析【星际争霸游戏案例】

    - **深复制与浅复制**:`clone`关键字默认执行的是浅复制,如果对象属性包含其他对象的引用,仅复制对象引用而非整个对象。如果需要完全独立的副本(即深复制),可能需要额外的处理。 - **资源管理**:如果原型对象...

    learn-design-pattern:自己学习设计模式的回购

    5. **原型模式(Prototype)**:通过复制已有对象来创建新对象,避免了复杂的初始化步骤。在PHP中,可以利用`__clone`魔术方法实现对象的克隆。 6. **观察者模式(Observer)**:定义对象间的一对多依赖关系,当一...

    免疫克隆

    对于深复制,开发者可能需要使用`serialize`和`unserialize`函数,或者第三方库来确保所有嵌套的对象都被完整复制。 描述中的"免疫克隆"可能是指该项目在安全方面采用了某种模仿生物免疫系统的方式来防御网络攻击。...

    adminer-clean-skin:为管理员清理主题

    5. **深色/浅色模式**:理解两种模式的实现,可能是通过媒体查询或其他 CSS 技术切换背景和文字颜色。 6. **源代码版本控制**:"master" 表示主分支,可能涉及 Git 版本控制,了解基本的 Git 命令如 clone、pull 和 ...

Global site tag (gtag.js) - Google Analytics