PHP 魔术方法 - __clone()
大家在日常使用 PHP 时有需要用到复制一个对象的时候吗?就是使用 clone
关键子复制一个对象 ?那你知道 PHP 中的 clone
关键字是深拷贝还是浅拷贝 ( shallow copy ) 呢 ?
在笔者我自己的日常开发中,还真很少,或者几乎没有用到 clone
的机会,即使有,也不会往这边想 !
PHP 中的拷贝对象
首先,需要声明的是,PHP 中的拷贝是 浅拷贝 ( shallow copy ) ,也就是说,当我们使用 clone
拷贝一个对象后,新的对象的属性仍然会指向原来的旧对象的属性上
其次,PHP 对象的拷贝完成后,如果对象存在 __clone()
魔术方法,则还会自动调用该魔术方法,我们可以在该魔术方法里修改新对象的属性
魔术方法 __clone()
当使用 clone
关键字拷贝完成一个对象后,新对象会自动调用定义的魔术方法 __clone()
,如果该魔术方法存在的话
该魔术方法的原型如下
void __clone ( void )
__clone()
方法既没有返回值,也没有参数,因为它是在新对象上创建的。该魔术方法不能被外部主动调用,只能由 clone
关键字调用
范例
下面的方法,我们为 Person
类定义了魔术方法 __clone()
,并在该方法里面把 计数 +1
<?php class Person { public $sex; public $name; public $age; public static $cnt = 1; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } public function __clone() { echo "自动调用魔术方法 __clone()\n"; self::$cnt++; } } $person = new Person('Yufei',30); var_dump('person:'); var_dump($person); echo $person::$cnt,"\n"; $person2 = clone $person; var_dump('person2:'); var_dump($person2); echo $person2::$cnt,"\n"; $person3 = clone $person2; var_dump('person3:'); var_dump($person3); echo $person3::$cnt,"\n";
运行结果如下
[yufei@localhost php]$ php demo.php string(7) "person:" object(Person)#1 (3) { ["sex"]=> string(4) "Male" ["name"]=> string(5) "Yufei" ["age"]=> int(30) } 1 自动调用魔术方法 __clone() string(8) "person2:" object(Person)#2 (3) { ["sex"]=> string(4) "Male" ["name"]=> string(5) "Yufei" ["age"]=> int(30) } 2 自动调用魔术方法 __clone() string(8) "person3:" object(Person)#3 (3) { ["sex"]=> string(4) "Male" ["name"]=> string(5) "Yufei" ["age"]=> int(30) } 3