Ich habe eine Frage zur statischen Funktion in PHP.
Nehmen wir an, ich habe eine Klasse
class test {
public function sayHi() {
echo 'hi';
}
}
Wenn ich es tue test::sayHi();
, funktioniert es ohne Probleme.
class test {
public static function sayHi() {
echo 'hi';
}
}
test::sayHi();
funktioniert auch.
Was sind die Unterschiede zwischen erster und zweiter Klasse?
Was ist das Besondere an einer statischen Funktion?
Antworten:
In der ersten Klasse
sayHi()
handelt es sich tatsächlich um eine Instanzmethode, die Sie als statische Methode aufrufen und mit der Sie durchkommen, weil sie sichsayHi()
nie darauf bezieht$this
.Statische Funktionen sind der Klasse zugeordnet, keine Instanz der Klasse. Ist als solches
$this
nicht in einem statischen Kontext verfügbar ($this
zeigt nicht auf ein Objekt).quelle
Statische Funktionen funktionieren einfach unabhängig von der Klasse, zu der sie gehören.
$ Dies bedeutet, dass dies ein Objekt dieser Klasse ist. Dies gilt nicht für statische Funktionen.
quelle
Der ganze Unterschied besteht darin, dass Sie nicht
$this
innerhalb der statischen Funktion versorgt werden. Wenn Sie versuchen zu verwenden$this
, erhalten Sie eineFatal error: Using $this when not in object context
.Okay, noch ein Unterschied:
E_STRICT
Ihr erstes Beispiel generiert eine Warnung.quelle
$this
Bezieht sich auf das aktuelle Objekt. In einer statischen Funktion gibt es kein aktuelles Objekt. Die Funktion ist in der Klasse vorhanden, ohne dass eine Objektinstanz dieser Klasse benötigt oder auf diese verwiesen werden muss.Das statische Aufrufen nicht statischer Methoden generiert eine Warnung auf E_STRICT-Ebene.
quelle
Kurz gesagt, Sie haben das Objekt im zweiten Fall nicht als $ this, da die statische Methode eine Funktion / Methode der Klasse und nicht die Objektinstanz ist.
quelle
Nachdem ich Beispiele ausprobiert hatte (PHP 5.3.5), stellte ich fest, dass Sie in beiden Fällen beim Definieren von Funktionen den
$this
Operator nicht zum Arbeiten an Klassenfunktionen verwenden können. Also konnte ich noch keinen Unterschied in ihnen finden. :((quelle