Ü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); ?>
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:
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);
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; }
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);
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);
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);
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;
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.
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();//当调用本不存在的方法时。
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();//当调用本不存在的方法时。
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!