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?
Odpowiedzi:
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
$this
nie jest dostępna z kontekstu statycznego ($this
nie wskazuje na żaden obiekt).źródło
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.
źródło
Cała różnica polega na tym, że nie jesteś
$this
dostarczany wewnątrz funkcji statycznej. Jeśli spróbujesz użyć$this
, otrzymasz plikFatal error: Using $this when not in object context
.No dobra, jeszcze jedna różnica:
E_STRICT
Twój pierwszy przykład generuje ostrzeżenie.źródło
$this
odnosi 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.Wywołanie metod niestatycznych w sposób statyczny generuje ostrzeżenie na poziomie E_STRICT.
źródło
Krótko mówiąc, w drugim przypadku nie masz obiektu jako $ this, ponieważ metoda statyczna jest funkcją / metodą klasy, a nie instancją obiektu.
źródło
Po wypróbowaniu przykładów (PHP 5.3.5) stwierdziłem, że w obu przypadkach definiowania funkcji nie można używać
$this
operatora do pracy z funkcjami klasowymi. Więc nie mogłem jeszcze znaleźć w nich różnicy. :(źródło