PHP statische Funktion

108

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?

Mond
quelle
15
Ab PHP7 können Sie nicht statische Methode nicht statisch aufrufen
Sanjay Yadav

Antworten:

153

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 sich sayHi()nie darauf bezieht$this .

Statische Funktionen sind der Klasse zugeordnet, keine Instanz der Klasse. Ist als solches $thisnicht in einem statischen Kontext verfügbar ( $thiszeigt nicht auf ein Objekt).

Jonathan Fingland
quelle
22
Jetzt funktioniert der statische Aufruf nicht statischer Methoden, ist jedoch veraltet. Seien Sie vorsichtig mit dieser Syntax, zum Beispiel Methoden!
Jet
1
Deshalb sagen sie es als statische Funktion? weil es keine Mehrfachinstanz mit dynamischem Datenfluss und dynamischer Ausgabe gibt. Führe mich einfach. @ Chaos
Sonne
22

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.

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'
user2132859
quelle
9
Ok, ich bin kein PHP-Assistent, aber wird die Variable ('Hallo') nicht an die statische Funktion übergeben und explizit mit 'Hi' überschrieben? Dies bedeutet, dass der Zeilendruck test1 :: sayHi ('Hallo'); würde nicht "Hallo" zurückgeben, sondern "Hallo" zurückgeben?
Fnord23
6
Diese Antwort ist schlampig (die Wirkung statischer Funktionen kann davon abhängen, in welcher Klasse sie sich befinden), und die Beispiele machen den Punkt nicht sehr deutlich.
Reinierpost
Kein sehr gutes Beispiel. $ hi = 'Hi'; überschreibt das angegebene Argument und hat nichts mit statischer Deklaration zu tun. Ich würde das wie folgt beheben: self :: $ hi = $ hi; und es würde genauso funktionieren wie das nicht statische. Sie können mit self :: anstelle von $ this->
GotBatteries
20

Der ganze Unterschied besteht darin, dass Sie nicht $thisinnerhalb 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_STRICTIhr erstes Beispiel generiert eine Warnung.

Chaos
quelle
1
Ich habe keine Warnung, wenn ich zuerst benutze und ich bin in PHP7
Ashkan Nasirzadeh
Warum haben wir $ this nicht in einer statischen Funktion? Was ist die architektonische Logik davon? Vielen Dank.
Lucas Bustamante
@LucasBustamante: $thisBezieht 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.
Chaos
3

Das statische Aufrufen nicht statischer Methoden generiert eine Warnung auf E_STRICT-Ebene.


quelle
2

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.

Czimi
quelle
1
Ist statisch einfach, wie Sie Klassenfunktionen definieren? kein anderes schickes Geschäft? Sie sagen also, wenn es "class_method" statt "static" genannt worden wäre, wäre es semantischer?
Ahnbizcad
1

Nachdem ich Beispiele ausprobiert hatte (PHP 5.3.5), stellte ich fest, dass Sie in beiden Fällen beim Definieren von Funktionen den $thisOperator nicht zum Arbeiten an Klassenfunktionen verwenden können. Also konnte ich noch keinen Unterschied in ihnen finden. :((

Yogesh
quelle