Detaillierte Erklärung von Referenzen und Klonen in PHP

小云云
Freigeben: 2023-03-20 18:56:02
Original
1418 Leute haben es durchsucht

Die Methode clone() generiert eine Kopie des ausgewählten Elements, einschließlich untergeordneter Knoten, Text und Attributen. Dieser Artikel teilt Ihnen hauptsächlich die detaillierte Erklärung des Zitierens und Klonens in PHP mit und hofft, allen zu helfen.

<?php
class Person{
	private $name=&#39;personName&#39;;

	public function  __construct($name){
		   $this->name=$name;
	}

	public function showName(){
		var_dump('current class is '.$this->name);
	}

	public function setName($name){
		$this->name=$name;
	}

	public function getName(){
		return $this->name;
	}
}

$xiaoming=new Person('xiaoming');
$xiaoming->showName();//current class is xiaoming

//1.将对象赋值给一个变量时候
//对象引用的传递,即xiaoming和xiaoli指向的是同一个对象,改变任意一个对象,另一个对象也发生改变
$xiaoli=$xiaoming; 
$xiaoli->showName();//current class is xiaoming

$xiaoli->setName("xiaoli");
$xiaoli->showName();//current class is xiaoli
$xiaoming->showName();//current class is xiaoli

$xiaoming->setName("xiaomingA");
$xiaoli->showName();//current class is xiaomingA
$xiaoming->showName();//current class is xiaomingA

//1.将对象作为参数传递时候
//如果将一个对象作为函数的实参传递,当改变形参对应的属性的时候,对象的属性也发生变化
function modifyObj($obj){
	$obj->setName('modifyObj');
}
modifyObj($xiaoming);
$xiaoming->showName();//current class is modifyObj

// 思考:可能有人会想,我仅仅是为了获取对象的一个副本,并不想对原对象进行操作,该怎么办呢?
$xiaowang=clone $xiaoming;//注意,前提是在类中没有重写__clone()函数,且设置禁止对象被复制。
$xiaowang->showName();//current class is modifyObj
$xiaowang->setName('xiaowang');
$xiaowang->showName();//current class is xiaowang
$xiaoming->showName();//current class is modifyObj 
//总结:通过上面的现象说明了,php中虽然没有指针的概念,但是却和java类似,有了引用。

//关于PHP中的__clone(),我觉得有必要再次强调一下,php的__clone()方法对一个对象实例进行的浅复制,对象内的基本数值类型进行的是传值复制,而对象内的对象型成员变量,如果不重写__clone方法,显式的clone这个对象成员变量的话,这个成员变量就是传引用复制,而不是生成一个新的对象,直接通过实例演示

class Student{
	private $name='someStudent';
	private $person=null;
	public function  __construct($name,$person){
		   $this->name=$name;
		   $this->person=$person;
	}

	public function showName(){
		var_dump('current Student class is '.$this->name.' ,current Person class is '.$this->person->getName());
	}

	public function setName($name){
		$this->name=$name;
	}

	public function setPersonName($name){
		$this->person->setName($name);
	}

	public function __clone(){
		$this->person=clone $this->person;
	}
}

$stu1=new Student('stu1',$xiaowang);
$stu1->showName();//current Student class is stu1 ,current Person class is xiaowang

$stu2=clone $stu1;
$stu2->setName('stu2');
$stu2->setPersonName('stu2_persion');

$stu2->showName();//current Student class is stu2 ,current Person class is stu2_persion
$stu1->showName();//current Student class is stu1 ,current Person class is stu2_persion

//这说明了克隆以后,stu1和stu2对象person属性里面仍然保存的是同一个对象的引用
//如果让stu1和stu2对象person属性不是同一个对象,只需要改写Student类的clone,即将77行注释取消掉即可

$stu3=clone $stu1;
$stu3->setName('stu3');
$stu3->setPersonName('stu3_persion');

$stu3->showName();//current Student class is stu3 ,current Person class is stu3_persion
$stu1->showName();//current Student class is stu1 ,current Person class is xiaowang
Nach dem Login kopieren

Verwandte Empfehlungen:

Die Funktion clone() in jQuery implementiert das Hinzufügen und Subtrahieren von Eingabeelementen im Formular

Wie um den DOM Copy clone() zu verstehen

Detaillierte Erklärung des Klonobjekt-/Funktionscodes in Javascript

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von Referenzen und Klonen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!