Szukałem źródła Drupala 7 i znalazłem kilka rzeczy, których wcześniej nie widziałem. Najpierw zajrzałem do podręcznika php, ale nie wyjaśniłem tych przykładów.
Co robi słowo kluczowe static
ze zmienną wewnątrz funkcji?
function module_load_all($bootstrap = FALSE) {
static $has_run = FALSE
Odpowiedzi:
Sprawia, że funkcja zapamiętuje wartość danej zmiennej (
$has_run
w naszym przykładzie) między wieloma wywołaniami.Możesz użyć tego do różnych celów, na przykład:
W tym przykładzie
if
operacja zostanie wykonana tylko raz. Nawet jeślidoStuff
wystąpiłoby wiele wywołań .źródło
$cache
donull
przy późniejszych wywołaniach, prawda?$cache
zostanie zresetowany tylko między żądaniami. Więc tak, nie będzie resetowany przy późniejszych wywołaniach w tym samym żądaniu (lub wykonaniu skryptu).if
sprawdzanie warunku$cache === null
byłoby wykonywane za każdym razem, gdy wywoływana jest ta funkcja, a nie, gdyby kod blokowy$cache = '..'
został wykonany.Wygląda na to, że nikt do tej pory nie wspomniał, że zmienne statyczne w różnych instancjach tej samej klasy pozostają w ich stanie. Dlatego zachowaj ostrożność podczas pisania kodu OOP.
Rozważ to:
Jeśli chcesz, aby zmienna statyczna pamiętała swój stan tylko dla bieżącej instancji klasy, lepiej trzymaj się właściwości klasy, takiej jak ta:
źródło
Biorąc pod uwagę następujący przykład:
Pierwsze połączenie
wyjdzie
10
, a następnie$v
będzie20
. Zmienna$v
nie jest usuwana z pamięci po zakończeniu funkcji, ponieważ jest zmienną statyczną (niedynamiczną). Zmienna pozostanie w swoim zakresie do całkowitego zakończenia działania skryptu.Dlatego następujące wywołanie
wyświetli wynik
20
, a następnie zostanie ustawiony$v
na15
.źródło
Statyczny działa tak samo, jak w klasie. Zmienna jest wspólna dla wszystkich instancji funkcji. W Twoim przykładzie po uruchomieniu funkcji $ has_run jest ustawiana na TRUE. Wszystkie przyszłe uruchomienia funkcji będą miały $ has_run = TRUE. Jest to szczególnie przydatne w funkcjach rekurencyjnych (jako alternatywa dla przekazywania liczby).
Zobacz http://php.net/manual/en/language.variables.scope.php
źródło
zmienna statyczna w funkcji oznacza, że bez względu na to, ile razy wywołujesz funkcję, jest tylko jedna zmienna.
źródło
Aby rozwinąć odpowiedź Yang
Jeśli rozszerzysz klasę o zmienne statyczne, poszczególne klasy rozszerzone będą posiadać własne, do których odwołuje się statystyka, które są współdzielone między instancjami.
wyjścia:
http://ideone.com/W4W5Qv
źródło
Wewnątrz funkcji
static
oznacza, że zmienna zachowa swoją wartość za każdym razem, gdy funkcja zostanie wywołana w trakcie ładowania strony.Dlatego w podanym przykładzie, jeśli wywołasz funkcję dwukrotnie, jeśli jest ustawiona
$has_run
natrue
, wówczas funkcja będzie mogła wiedzieć, że została wcześniej wywołana, ponieważ$has_run
nadal będzie równa temu,true
gdy funkcja zostanie uruchomiona po raz drugi.Użycie
static
słowa kluczowego w tym kontekście jest wyjaśnione w podręczniku PHP tutaj: http://php.net/manual/en/language.variables.scope.phpźródło