Wie erklärt man die beiden $this in der __clone()-Methode von PHP? Was bedeuten sie?
<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>
Wie erklärt man die beiden $this in der __clone()-Methode von PHP? Was bedeuten sie?
<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>
Es gibt keine zwei
s in __clone()
$this
, nur ein $this
. Dieses $this
zeigt auf das geklonte neue Objekt, da die __clone()
-Methode im neuen Objekt aufgerufen wird.
Beim Klonen führt PHP zunächst eine flache Kopie durch, erstellt ein neues Objekt und kopiert alle Attribute des Originalobjekts in das neue Objekt. Bei Referenzvariablen wie Objekten und Ressourcen werden nur deren Zeiger kopiert, aber nicht geklont. Wenn Sie eine tiefe Kopie dieser Eigenschaften erstellen müssen, müssen Sie sie separat in __clone()
klonen.
Zum Beispiel:
<code>class MyCloneable { public $obj; function __clone() { $this->obj = clone $this->obj; } }</code>
Beachten Sie hier, dass sich beide $this->obj
auf das $obj
-Attribut der neuen Klasse beziehen, da beim Klonen das $obj
des neuen Objekts nur geringfügig vom Originalobjekt kopiert wurde Führen Sie eine tiefe Kopie durch, sodass ein weiterer Klon auf $this->obj
durchgeführt wurde.