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
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.