Heim > Backend-Entwicklung > PHP-Tutorial > Was ist der Unterschied zwischen new self() und new static() in PHP objektorientiert?

Was ist der Unterschied zwischen new self() und new static() in PHP objektorientiert?

巴扎黑
Freigeben: 2023-03-15 11:30:02
Original
2685 Leute haben es durchsucht

Der Unterschied zwischen new self() und new static() im objektorientierten PHP ist: Die von new self() zurückgegebene Instanz bleibt unverändert und gibt immer eine Instanz derselben Klasse zurück, die von new zurückgegeben wird static() wird vom Aufrufer bestimmt.

Was ist der Unterschied zwischen new self() und new static() in PHP objektorientiert?

new static() ist eine neue Funktion, die in PHP5.3 eingeführt wurde. Ob new static() oder new self(), ein neues Objekt ist neu. Was ist der Unterschied zwischen den mit diesen beiden Methoden neu erzeugten Objekten? Der folgende Artikel stellt es Ihnen vor.

Der Unterschied zwischen new self() und new static() im objektorientierten PHP

Um dieses Problem zu untersuchen, erstellen wir zunächst einen einfachen Code:

class Father {

    public function getNewFather() {
        return new self();
    }

    public function getNewCaller() {
        return new static();
    }

}

$f = new Father();

print get_class($f->getNewFather());
print get_class($f->getNewCaller());
Nach dem Login kopieren

Beachten Sie, dass die Methode get_class() im obigen Code verwendet wird, um den Klassennamen abzurufen, zu dem die Instanz gehört.

Das Ergebnis hier ist: Unabhängig vom Aufruf von getNewFather() oder getNewCaller() wird eine Instanz der Father-Klasse zurückgegeben.

Das gedruckte Ergebnis ist: FatherFather

Zu diesem Zeitpunkt scheint es keinen Unterschied zwischen new self() und new static() zu geben. Machen wir weiter:

class Sun1 extends Father {

}

class Sun2 extends Father {

}
$sun1 = new Sun1();$sun2 = new Sun2();
print get_class($sun1->getNewFather());
print get_class($sun1->getNewCaller());
print get_class($sun2->getNewFather());
print get_class($sun2->getNewCaller());
Nach dem Login kopieren

Sehen Sie sich den obigen Code an. Da getNewFather() und getNewCaller() der Father-Klasse öffentlich sind, erben die Unterklassen diese beiden Methoden.

Das gedruckte Ergebnis ist:

FatherSun1FatherSun2
Nach dem Login kopieren

Wir haben festgestellt, dass das durch den Aufruf von getNewFather() zurückgegebene Objekt unabhängig davon, ob es Sun1 oder Sun2 ist, eine Instanz der Father-Klasse ist, während getNewCaller() return ist die Instanz des Aufrufers.

Das heißt, $sun1 gibt eine Instanz der Sun1-Klasse zurück und $sun2 gibt eine Instanz der Sun2-Klasse zurück.

Jetzt scheine ich den Unterschied zwischen new self() und new static() zu verstehen.

Erstens kann sich ihr Unterschied nur in der Vererbung widerspiegeln. Wenn es keine Vererbung gibt, gibt es keinen Unterschied zwischen den beiden.

Dann bleibt die von new self() zurückgegebene Instanz über Tausende von Jahren unverändert. Unabhängig davon, wer sie aufruft, wird sie eine Instanz derselben Klasse zurückgeben, während new static() vom Aufrufer bestimmt wird.

Der Aufrufer von $sun1->getNewCaller() oben ist $sun1, richtig! $sun1 ist eine Instanz der Klasse Sun1, daher wird eine Instanz der Klasse Sun1 zurückgegeben. Der gleiche Grund für $sun2 wird nicht wiederholt.

Weitere Informationen zu diesem Thema finden Sie auf der PHP-Website für Chinesisch! !

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen new self() und new static() in PHP objektorientiert?. 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