Heim >php教程 >php手册 >1.2 Magische Methoden und verzögerte statische Bindung

1.2 Magische Methoden und verzögerte statische Bindung

WBOY
WBOYOriginal
2016-08-23 09:03:381149Durchsuche

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öst

8.__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>
Stellungnahme:
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
Vorheriger Artikel:redis并发问题Nächster Artikel:微信企业付款API接口核心类