php面向对象之克隆对象
在前面的PHP面向对象之对象和引用,我们试图以"$b=$a"的方式复制对象以传递对象的值(内容),结果却是传递对象的地址,在结尾为了解决复制对象这个问题,提到了克隆的方法。接下来讲一下php面向对象之克隆对象。
前面我们已经知道,使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在PHP中可以根据现在的对象来克隆出一个完全一样的对象,克隆出来的副本和原本两个对象完全独立而互不干扰。
对象克隆
在php中使用"clone"关键字来克隆对象。
01 | <?php |
02 | class Person { |
03 | public $name ; |
04 | |
05 | function __construct( $name = "" ) { |
06 | $this ->name = $name ; |
07 | |
08 | } |
09 | function say() { |
10 | echo "我叫:" . $this ->name . "<br>" ; |
11 | } |
12 | } |
13 | $Person = new Person( "张三" ); |
14 | $Person1 =clone $Person ; //使用clone关键字克隆(复制)对象,创建一个对象的副本 |
15 | // $Person1=$Person //这不是复制对象,而是为对象多复制出一个访问该对象的引用 |
16 | $Person ->say(); |
17 | $Person1 ->say(); |
18 | |
19 | ?> |
上面程序运行结果为:
我叫:张三
我叫:张三
克隆的副本和原本拥有相同的类和属性
1 | if ( $Person == $Person1 ){ |
2 | echo "Person和Person1具有相同的类和属性" ; |
3 | } else { |
4 | return false; |
5 | } |
程序输出:Person和Person1具有相同的类和属性
克隆的副本和原本存储在不相同的位置
1 | if ( $Person === $Person1 ){ |
2 | echo "Person和Person1具有相同的类和属性且存储在相同的位置" ; |
3 | } else { |
4 | return false ; |
5 | } |
程序结果为false。
克隆的副本和原本独立而互不干扰
我们来改变一下原本的属性值,看一下有什么影响
1 | $Person = new Person( "张三" ); |
2 | $Person1 =clone $Person ; |
3 | $Person1 -> name= '李四' ; |
4 | $Person ->say(); |
5 | $Person1 ->say(); |
程序运行结果为:
我叫:张三
我叫:李四
由此可知,克隆出来的副本和原本两个对象完全独立而互不干扰。
__clone()方法
如果需要为克隆后的副本对象克隆时重新为成员属性赋值,可以在类中声明一个魔术方法"__clone"
01 | <?php |
02 | class Person { |
03 | public $name ; |
04 | |
05 | function __construct( $name = "" ) { |
06 | $this ->name = $name ; |
07 | |
08 | } |
09 | function __clone(){ //在对象克隆时自动调用,用来为新对象重新赋值 |
10 | $this ->name = '李四' ; |
11 | } |
12 | function say() { |
13 | echo "我叫:" . $this ->name . "<br>" ; |
14 | } |
15 | } |
16 | $Person = new Person( "张三" ); |
17 | $Person1 =clone $Person ; |
18 | $Person ->say(); |
19 | $Person1 ->say(); |
20 | |
21 | ?> |
程序运行结果为:
我叫:张三
我叫:李四