Detaillierte Erklärung der Überladung in PHP

小云云
Freigeben: 2023-03-22 20:20:01
Original
3095 Leute haben es durchsucht

Überladen in PHP unterscheidet sich von anderen objektorientierten Sprachen (C#, Java). Beispielsweise hat das Überladen in C# denselben Methodennamen, aber unterschiedliche formale Parameterlisten (d. h. die Anzahl der formalen Parameter). Ein anderer Typ Die Funktion bestimmt anhand der formalen Parameterliste beim Aufruf, welche Methode aufgerufen werden soll.

Überladen in PHP dient der Verarbeitung unzugänglicher Mitglieder des aktuellen Objekts (nicht definiert oder definiert, aber unzugänglich):

<?php
	Class Student{
		private $_age;
	}
	$o1=new Student();
	$o1->_name="Li";
	var_dump($o1);
	echo "<br/>";
	$o1->_age=24;
	var_dump($o1);
 ?>
Nach dem Login kopieren

Aus diesem Ergebnis können wir ersehen, dass beim Zugriff auf das nicht vorhandene Mitglied $_name das Mitglied als gemeinsames Attribut in das Objekt eingefügt wird. Bei Problemen mit Zugriffsrechten wird ein Fehler gemeldet.

Für diese Situation gibt es einige magische Methoden zur Attributüberladung in PHP:

Attributüberladung

1.__set($name,$value): Beim Aufruf Wenn a Attribut ist nicht zugänglich (existiert nicht/Zugriff ist eingeschränkt), ruft das System automatisch die Funktion __set() in der entsprechenden Klasse auf. $name stellt den aufgerufenen Attributnamen dar und $value stellt den während der Operation übergebenen Wert dar.

Wenn das Attribut nicht vorhanden ist:

<?php
	Class Student{
		private $_age;
		function __set($name,$value){
			
		}
	}
	$o1=new Student();
	$o1->_name="Li";
	var_dump($o1);
Nach dem Login kopieren

Hier nehmen wir einige Änderungen am obigen Beispiel vor : Fügen Sie der Student-Klasse eine __set()-Methode hinzu. Wenn der Code $o1->_name="Li"; ausgeführt wird, wird die __set()-Methode automatisch aufgerufen. Da es keinen Code enthält, ist es unmöglich, die gleiche Zuweisung wie in der Standardeinstellung zu erreichen. Daher gibt es im angezeigten $o1-Objekt nur eine private Eigenschaft $_age.

Sie können diesen Code auch in schreiben __set()-Methode:

    function __set($name,$value){
$this->$name=$value;
}
Nach dem Login kopieren

Das Ergebnis zu diesem Zeitpunkt ist


 Wenn das Attribut vorhanden ist, aber nicht darauf zugegriffen werden kann :

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age;
		function __set($name,$value){
		//进入该函数表示$name 这个属性不可访问。
			if(property_exists($this,$name)){
				//property_exists()函数判断当前对象($this)中是否存在$name属性。
				trigger_error("属性不可访问!",E_USER_ERROR);
			}else{
				
			}
		}
	}
	$o1=new Student();
	$o1->_age=2;
	var_dump($o1);
Nach dem Login kopieren

2.__get(): Wird ausgelöst, wenn auf ein nicht zugängliches Mitglied zugegriffen wird:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
		function __get($name){
		//进入该函数表示$name 这个属性不可访问。
			return $this->$name;
		}
	}
	$o1=new Student();
	echo $o1->_age;
	echo "<br/>";
	var_dump($o1);
Nach dem Login kopieren

3.__unset(): Diese Funktion wird ausgelöst, wenn eine Variable gelöscht wird.

Sein spezifisches Anwendungsszenario: Wir alle kennen die Funktion unset(), die eine bestimmte Variable löscht. Dies kann beispielsweise auch in Objekten verwendet werden, wenn $_age öffentlich ist kann unset($o1->_age) verwenden. Allerdings ist $_age hier ein privates Attribut, auf das derzeit nicht mit unset() zugegriffen werden kann.

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
	}
	$o1=new Student();
	unset($o1->_age);
Nach dem Login kopieren


Dies erfordert die magische Methode __unset(), um das Löschen von Attributen in der Klasse zu implementieren:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
		function __get($name){
			return $this->$name;//正常应该有判断语句,这里省略了。
		}
		function __unset($name){
			unset($this->$name);
		}
	}
	$o1=new Student();
	echo $o1->_age;
	unset($o1->_age);
	echo $o1->_age;
Nach dem Login kopieren


Die spezifische Anwendung ähnelt den oben genannten __set() und __get(), d. h. wenn Sie den Wert (Variablenname) aufheben, wird automatisch die Methode __unset() und der Methodenkörper aufgerufen kann es selbst definieren.

4.__isset(): Wird hauptsächlich verwendet, um festzustellen, ob Attribute vorhanden sind, genau wie __unset(). Wenn von außen festgestellt werden soll, ob ein Attribut vorhanden ist, kann mit der Funktion isset() nicht auf die private Variable zugegriffen werden. In diesem Fall kann die Methode __isset() zum Definieren verwendet werden.

Überladene Methoden

Die Bedingungen für Methodenüberladung und Attributüberladung sind dieselben: Wenn eine Methode aufgerufen wird, die nicht existiert oder auf die nicht zugegriffen werden kann, werden die Methoden __call() und Static__callStatic() aufgerufen .

Rufen Sie eine Methode auf, die standardmäßig nicht im System vorhanden ist:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		public static $a=1;
		private $_age=23;
	}
	$o1=new Student();
	$o1->getName();//当调用本不存在的方法时。
Nach dem Login kopieren

Im System tritt ein schwerwiegender Fehler auf.

__call(): Die magische Methode, die beim Aufruf mit einem Objekt verwendet wird

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		public static $a=1;
		private $_age=23;
		function __call($name,$arr){
			//$name表示传入的方法名,$arr表示传入的方法列表(是一个数组)。
			trigger_error("不存在该函数",E_USER_NOTICE);//直接报错
			//也可以在此重写函数。
		}
	}
	$o1=new Student();
	$o1->getName();//当调用本不存在的方法时。
Nach dem Login kopieren

Static__callStatic(): Verwendung einer Klassenaufrufmethode, d. h. Aufrufen eines Objekts, das nicht vorhanden ist. Diese magische Methode kann verwendet werden, wenn eine statische Methode vorhanden ist.

Verwandte Empfehlungen:

Einführung in die Überladung in PHP

Detaillierte Erläuterung der Funktionsüberladung in JavaScript

Detaillierte Beispiele für Überladung und magische Methoden in PHP

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der Überladung 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!