1. Magische Methode:
1.__get,__set
__get: Wird ausgelöst, wenn ein Attribut abgerufen wird, auf das nicht zugegriffen werden kann (unzugänglich bedeutet, dass das Attribut nicht existiert oder keine Zugriffsberechtigung vorliegt )
__set: Wird ausgelöst, wenn einer unzugänglichen Eigenschaft ein Wert zugewiesen wird
2.__isset,__unset
__isset: Wird ausgelöst, wenn mithilfe der isset()-Funktion
eine unzugängliche Eigenschaft ermittelt wird__unset: Wird ausgelöst, wenn die Funktion unset() verwendet wird, um eine unzugängliche Eigenschaft zu bedienen
3.__call,__callStatic
__call: wird ausgelöst, wenn eine unzugängliche Methode aufgerufen wird
__callStatic: wird ausgelöst, wenn eine unzugängliche statische Methode aufgerufen wird
4.__konstruieren,__zerstören
__construct: Wird beim Initialisieren eines Objekts
ausgelöst__destruct: Wird ausgelöst, wenn das Objekt zerstört oder das Skript ausgeführt wird
5.__automatisches Laden
__autoload: wird ausgelöst, wenn eine nicht zugängliche Klasse verwendet wird
6.__Klon
__clone: Wird ausgelöst, wenn das Objekt geklont wird
7.__schlafen,__aufwachen
__sleep: Wird ausgelöst, wenn Serialisieren verwendet wird
__wakeup: Wird bei Verwendung von unserialize
ausgelöst8.__toString,__invoke
__toString: Wird ausgelöst, wenn ein Objekt als String verarbeitet wird. Wenn $obj beispielsweise ein Objekt ist, löst echo $obj __toString
aus__invoke: Wird ausgelöst, wenn ein Objekt als Funktion verwendet wird. Wenn $obj ein Objekt ist, löst $obj() __invoke
aus
2. Verzögerte statische Bindung
Legen Sie das Konzept beiseite und schauen Sie sich Beispiele an, um zu verstehen:
Wie kam es überhaupt zu einer verzögerten statischen Bindung? Siehe das folgende Beispiel:
class A{<br>}<br>class B extends A{<br> public static function out(){<br> return new self();<br> }<br>}<br>class C extends A{<br> public static function out(){<br> return new self();<br> }<br>}<br>var_dump(B::out());//结果是object(B)#1 (0) { }<br>var_dump(C::out());//结果是object(C)#1 (0) { }<br>然后我们将子类中相同的代码抽取到父类class A中,变成:
class A{<br> public static function out(){<br> return new self();<br> }<br>}<br>class B extends A{<br>}<br>class C extends A{<br>}<br>var_dump(B::out());//结果是object(A)#1 (0) { }<br>var_dump(C::out());//结果是object(A)#1 (0) { }<br>这个结果显然不是我们想要的,这里的问题主要是因为self指代的是它所在的类.这里self在类A里面,所以返回的永远是类A的对象,<br>而我们想要的是让out()方法返回调用它的类的对象而不是它所在的类的对象.怎么办?<br>此时我们马上可以想到$this可以代表调用它的对象,但是out()是一个静态方法,里面是不能出现$this的,怎么办?<br>用static.它也代表调用它的对象如:
class A{<br> public static function out(){<br> return new static();<br> }<br>}<br>class B extends A{<br>}<br>class C extends A{<br>}<br>var_dump(B::out());//结果是object(B)#1 (0) { }<br>var_dump(C::out());//结果是object(C)#1 (0) { }<br>这样就好了.这就是延迟静态绑定.<br><br>在看下面的例子:
Warum ist dieses Ergebnis? Analysieren wir es:
Zuerst ruft Objekt c die Methode get() auf, wird aber nicht in Klasse C gefunden, also sucht es in Klasse B danach und findet es. Dann führt es die Methode get aus,
Führen Sie zuerst A::foo() aus; Klasse A ruft direkt ihr eigenes foo() auf, gibt „fooA“ aus und ruft dann offensichtlich die Klasse A auf, die static::out() aufruft Ausgabe Der Klassenname ist ebenfalls A. (Fokus hier auf Klasse A)
Führen Sie dann parent::foo() aus. Hier wird foo() in Klasse A ausgeführt, „fooA“ wird ausgegeben und dann wird static::out() ausgeführt Diesmal ist der statische Aufrufer nicht Klasse A, sondern Klasse C, da parent die übergeordnete Klasse, aber keine bestimmte Klasse darstellt (hier konzentrieren wir uns auf die Methoden in der übergeordneten Klasse, unabhängig davon, wer die übergeordnete Klasse ist).
Führen Sie dann self::foo() aus. self stellt die Klasse dar, in der es sich befindet (Klasse B). Es führt zuerst foo() aus, ohne in der übergeordneten Klasse danach zu suchen, also gibt es „fooA“ aus und führt dann Folgendes aus: :out(), aus dem gleichen Grund ist die hier verwendete Statik nicht Klasse A, sondern Klasse C. Obwohl self Klasse B darstellt, kann self keine bestimmte Klasse darstellen.
Um es einfach auszudrücken: Objekt c beginnt mit der Ausführung von get()-->A::foo(); Zu diesem Zeitpunkt ist die Kette unterbrochen und es wird direkt aus Klasse A. Rufen Sie foo() auf, es hat nichts mit Objekt c zu tun. Natürlich bezieht sich „statisch“ hier auf Klasse A.
Als nächstes Objekt c-->parent::foo()--> foo()-->static::out() in Klasse A. Um es ganz klar auszudrücken: parent ist hier eine Zeigefunktion, Das heißt, dessen Methode foo() ausgeführt wird. Es kann also verstanden werden, dass Objekt c die Methode foo in Klasse A aufruft. Dann repräsentiert static in foo Klasse C
Schließlich hat Objekt c-->self::foo()-->foo()-->static::out() in Klasse A das gleiche wie oben, self hat hier auch eine Zeigefunktion , Aber wir erreichen endlich Klasse A. Es kann verstanden werden, dass Objekt c die foo-Methode in Klasse A aufruft. Dann repräsentiert static in foo Klasse C
<br><br>