funkcja statyczna php

108

Mam pytanie dotyczące funkcji statycznej w php.

załóżmy, że mam klasę

class test {
    public function sayHi() {
        echo 'hi';
    }
}

jeśli zrobię test::sayHi();to działa bez problemu.

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); działa również.

Jakie są różnice między pierwszą a drugą klasą?

Co jest specjalnego w funkcji statycznej?

Księżyc
źródło
15
Od php7 nie można statycznie wywoływać metody statycznej
sanjay yadav

Odpowiedzi:

153

W pierwszej klasie sayHi()jest w rzeczywistości metodą instancji, którą wywołujesz jako metodę statyczną i uchodzi ci to na sucho, ponieważ sayHi()nigdy się do niej nie odwołuje $this.

Funkcje statyczne są skojarzone z klasą, a nie z instancją klasy. Jako taka $thisnie jest dostępna z kontekstu statycznego ( $thisnie wskazuje na żaden obiekt).

Jonathan Fingland
źródło
22
Teraz statyczne wywołanie metod niestatycznych działa, ale jest przestarzałe. Uważaj, używając tej składni na przykład w metodach!
Jet
1
Więc dlatego mówią, że jest to funkcja statyczna? ponieważ nie ma wielu instancji z dynamicznym przepływem danych i dynamicznym wyjściem. Po prostu prowadź mnie. @ Chaos
niedz.
22

Po prostu funkcje statyczne działają niezależnie od klasy, do której należą.

$ oznacza to, że jest to obiekt tej klasy. Nie dotyczy funkcji statycznych.

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
źródło
9
Ok, nie jestem kreatorem PHP, ale czy zmienna („cześć”), która jest przekazywana do funkcji statycznej, nie jest jawnie zastępowana przez „Cześć”? Oznacza to, że linia wypisuje test1 :: sayHi ('cześć'); nie zwróci „cześć”, ale zwróci „cześć”?
Fnord23
6
Ta odpowiedź jest niedbała (efekt funkcji statycznych może zależeć od tego, w której klasie się znajdują), a przykłady nie wyjaśniają tego zbyt jasno.
reinierpost
Niezbyt dobry przykład. $ hi = 'Cześć'; zastępuje podany argument i nie ma nic wspólnego z deklaracją statyczną. Naprawiłbym to tak: self :: $ hi = $ hi; i działałby tak jak niestatyczny. Możesz uzyskać dostęp do zmiennych klasy za pomocą self :: zamiast $ this->
GotBatteries
20

Cała różnica polega na tym, że nie jesteś $thisdostarczany wewnątrz funkcji statycznej. Jeśli spróbujesz użyć $this, otrzymasz plik Fatal error: Using $this when not in object context.

No dobra, jeszcze jedna różnica: E_STRICTTwój pierwszy przykład generuje ostrzeżenie.

chaos
źródło
1
nie mam ostrzeżenie, gdy używam pierwszy i jestem w php7
Ashkan nasirzadeh
Dlaczego nie mamy $ this wewnątrz funkcji statycznej? Jaka jest tego logika architektoniczna? Dzięki.
Lucas Bustamante
@LucasBustamante: $thisodnosi się do bieżącego obiektu. W funkcji statycznej nie ma bieżącego obiektu; funkcja istnieje w klasie bez potrzeby lub odniesienia do instancji obiektu tej klasy.
chaos
3

Wywołanie metod niestatycznych w sposób statyczny generuje ostrzeżenie na poziomie E_STRICT.


źródło
2

Krótko mówiąc, w drugim przypadku nie masz obiektu jako $ this, ponieważ metoda statyczna jest funkcją / metodą klasy, a nie instancją obiektu.

Czimi
źródło
1
czy statyczny jest po prostu sposobem definiowania funkcji klasowych? nie ma innego wyszukanego interesu? Więc mówisz, że gdyby został nazwany „metoda_klasy” zamiast „statyczny”, byłby bardziej semantyczny?
ahnbizcad
1

Po wypróbowaniu przykładów (PHP 5.3.5) stwierdziłem, że w obu przypadkach definiowania funkcji nie można używać $thisoperatora do pracy z funkcjami klasowymi. Więc nie mogłem jeszcze znaleźć w nich różnicy. :(

jogesh
źródło