`

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对象克隆clone用法示例

    在`__clone()`方法中,开发者可以对对象的属性进行深复制的操作,例如,如果属性是对象类型,可以通过调用`clone`关键字来创建一个新的对象实例。 在PHP代码示例中,首先定义了两个类`A`和`B`,类`A`包含一个类`B`...

    php实现对象克隆的方法

    为了实现深克隆,PHP提供了一个名为__clone的魔术方法。__clone魔术方法会在对象被克隆后自动调用,可以在其中进行成员变量的修改,以实现深拷贝。 ```php class MyClass { private $var; public function __...

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

    在PHP中,通过`clone`关键字可以实现对象的深复制。 ```php $objA3 = clone $objA; $objA3-&gt;num = 4; ``` 在这个例子中,`$objA3`是`$objA`的深复制,所以`$objA-&gt;num`不会因为`$objA3-&gt;num`的改变而改变。然而,...

    PHP5学习教程.chm

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

    PHP5范例代码查询辞典

    - 复制对象:通常通过克隆(`clone`关键字)或序列化/反序列化实现对象的深拷贝或浅拷贝。 - 撤销对象:当对象不再使用时,可以显式地使用`unset`函数来销毁对象,释放内存。 #### 六、类图与对象信息的获取 - **...

    PHP中的浅复制与深复制的实例详解

    在PHP中,实现深复制有多种方法: 1. **利用`__clone`方法**:你可以重写`__clone`方法,手动为每个引用类型的属性创建新的实例。这种方法适用于知道所有引用类型属性的情况,但如果引用链复杂或有循环引用,可能会...

    php代码-PHP中的克隆

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

    php5面向对象

    但是,如果类中包含引用类型的属性,如数组或对象,克隆后的对象将共享这些引用,除非使用深拷贝或在`__clone()`魔术方法中显式复制这些属性。 例如: ```php class Product { public $name; public $options; ...

    php 魔术函数和常量一览表

    7. **\_\_clone()**:克隆对象时自动调用,可以在此函数中实现对属性的深度复制,确保克隆的对象独立于原对象。 8. **\_\_sleep()**:在序列化对象前调用,可以在此函数中执行一些操作,如关闭数据库连接或清除不必...

    php中拷贝构造函数、赋值运算符重载

    在PHP中实现深复制通常需要自定义一个方法来实现,例如,通过克隆对象(__clone)魔术方法。在这个方法中,可以手动复制对象内部所有需要的属性,并且确保新的对象属性引用的是独立的对象副本。这能够防止复制的对象...

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

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

    PHP5面向对象编程电子教程

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

    php中对象引用和复制实例分析

    在PHP中,深复制通常是通过序列化和反序列化的方法来实现。具体来说,可以使用serialize函数将对象序列化成一个字符串,然后使用unserialize函数将字符串反序列化回对象。在上面的示例中,$tv4=unserialize...

    PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间

    若需进行深拷贝,需要自行实现逻辑。 ```php class MyClass { public $field1; public $field2; function __clone() { // 实现逻辑 } } $obj1 = new MyClass(); $obj2 = clone $obj1; ``` 3. **对象...

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics