Maison > Article > développement back-end > 求解php的__clone()方法中两个$this的区别?
求解php的__clone()方法中的两个$this怎么解释?分别是什么含义?
<code>class Person { // 下面是人的成员属性var $name; // 人的名字 var $sex; // 人的性别 var $age; // 人的年龄 // 定义一个构造方法参数为属性姓名$name、性别$sex 和年龄$age 进行赋值 // function __construct($name="", $sex="",$age="") function __construct($name, $sex, $age) { $this->name = $name; $this->sex = $sex; $this->age = $age; } // 这个人可以说话的方法, 说出自己的属性 function say() { echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this ->age . "<br>"; } // 对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原来的属性和方法。 function __clone() { // $this 指的复本p2, 而$that 是指向原本p1,这样就在本方法里,改变了复本的属性。 $this->name = "我是复制的张三$this->name"; // $this->age = 30; } } $p1 = new Person ( "张三", "男", 20 ); $p2 = clone $p1; $p1->say (); $p2->say ();</code>
求解php的__clone()方法中的两个$this怎么解释?分别是什么含义?
<code>class Person { // 下面是人的成员属性var $name; // 人的名字 var $sex; // 人的性别 var $age; // 人的年龄 // 定义一个构造方法参数为属性姓名$name、性别$sex 和年龄$age 进行赋值 // function __construct($name="", $sex="",$age="") function __construct($name, $sex, $age) { $this->name = $name; $this->sex = $sex; $this->age = $age; } // 这个人可以说话的方法, 说出自己的属性 function say() { echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this ->age . "<br>"; } // 对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原来的属性和方法。 function __clone() { // $this 指的复本p2, 而$that 是指向原本p1,这样就在本方法里,改变了复本的属性。 $this->name = "我是复制的张三$this->name"; // $this->age = 30; } } $p1 = new Person ( "张三", "男", 20 ); $p2 = clone $p1; $p1->say (); $p2->say ();</code>
__clone()
中没有两个$this
,只有一个$this
,这个$this
所指向的是克隆出来的新对象,因为__clone()
方法是在新对象中被调用的。
在执行克隆时,PHP会先进行一次浅复制,新建一个对象,将原对象中的属性全部复制到新对象中。对于对象、资源这类引用变量,只是复制它们的指针,而不会克隆它们。如果需要对这些属性进行深复制,则需要在__clone()
单独对其进行克隆。
例如:
<code>class MyCloneable { public $obj; function __clone() { $this->obj = clone $this->obj; } }</code>
这里注意,两个$this->obj
都指的是新类的$obj
属性,因为克隆的时候新对象的$obj
已经从原对象浅复制过来了,这里只是因为我们要进行深复制,所以对$this->obj
再执行了一次克隆。