Maison >développement back-end >tutoriel php >Explication détaillée des références et du clonage en PHP

Explication détaillée des références et du clonage en PHP

小云云
小云云original
2018-03-05 13:45:321502parcourir

La méthode clone() génère une copie de l'élément sélectionné, y compris les nœuds enfants, le texte et les attributs. Cet article partage principalement avec vous l'explication détaillée de la citation et du clonage en PHP, dans l'espoir d'aider tout le monde.

<?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

Recommandations associées :

La fonction clone() dans jQuery implémente l'ajout et la soustraction d'éléments d'entrée sous la forme

Comment pour comprendre le DOM Copy clone()

Explication détaillée du code objet/fonction clone en javascript

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn