2012-02-29 16 views
7

To jest uproszczona wersja tego, co chcę osiągnąć:Jak zmienić wartość zmiennych statycznych w PHP?

W moim skrypcie chcę zmiennej, która zmienia true i false za każdym razem, gdy skrypt jest wykonywany.

<?php 
    static $bool = true; 

    // Print differente messages depending on $bool 
    if($bool == true) 
     echo "It's true!"; 
    else 
     echo "It's false!"; 

    // Change $bools value 
    if($bool == true) 
     $bool = false 
    else 
     $bool = true; 
?> 

Ale oczywiście to, co robię, jest złe. Zmienna $bool jest stale true i nie w pełni pojmowałem koncepcję zmiennych statycznych, które zakładam. Co ja robię źle?

Odpowiedz

14

PHP nie może zachować wartości zmiennych między żądaniami. Oznacza to, że za każdym razem, gdy twój skrypt zostanie wywołany, zmienna $bool zostanie ustawiona na true. Jeśli chcesz zachować wartość między żądaniami, musisz użyć sessions lub, jeśli chcesz, aby zmienna była dzielona między sesjami, jakiś mechanizm buforowania, taki jak APC lub .

Również, static jest używany w PHP do zadeklarowania zmiennej udostępnionej na poziomie klasy. Jest więc używany w klasach i jest dostępny jako self::$variableName; lub Foo::$variableName

Możesz przeczytać więcej o static properties here. Z dokumentacji:

Deklarowanie właściwości lub metod klasy jako statycznych powoduje, że są one dostępne bez potrzeby tworzenia instancji klasy. Właściwość zadeklarowana jako statyczna nie może być dostępna z instancjonowanym obiektem klasy (choć może to być metoda statyczna).

Należy również pamiętać, że słowo static został przeciążony od PHP 5.3, a także może być używany do określenia Late Static Binding, przy użyciu static::

+0

Hmm ... Więc gdybym przeniósł zmienną statyczną na klasę, czy byłbym w stanie zmienić jej wartość tam iz powrotem pomiędzy wykonaniami mojego głównego skryptu? – Weblurk

+0

Nie, zobacz moją odpowiedź. – BenM

+4

Nr Statyczny może być użyty do zadeklarowania zmiennych klasowych lub wewnątrz funkcji, aby zadeklarować zmienną, która trwa przez wywołania funkcji, ale nie przez wykonanie skryptu. –

2

Wartość statyczna nie będzie się utrzymywać w czasie wykonywania. Za każdym razem, gdy skrypt jest wykonywany, inicjuje się $ bool. Myślę, że powinieneś utrzymywać tę wartość w pliku, aby była prosta.

+0

Pomyślałem, że to był punkt ze zmiennymi statycznymi, że NIE trwają dłużej niż egzekucje. Wolałbym nie przechowywać go w oddzielnym pliku lub jest to jedyne rozwiązanie? – Weblurk

+0

Możesz użyć Memcache, APC, Redis, pliku ... cokolwiek chcesz. Ale musisz gdzieś przechowywać bieżącą wartość zmiennej. –

2

myślę, że trzeba lepiej zrozumieć punkcie zmienna statyczna. Magazyn dla zmiennej jest alokowany (i deallocated) na stosie wywołań, więc z punktu widzenia inżynierii oprogramowania, jego wartości nie można zmienić w czasie wykonywania.

Istnieją lepsze rozwiązania, jak zasugerowano powyżej.

+1

W rzeczywistości zmienne statyczne w PHP nie są wcale statyczne. Ich wartości można zmienić podczas wykonywania. Jest to tylko wspólna zmienna klasy. – PatrikAkerstrand

+0

To włącza kod taki jak 'Class Lookup {protected static $ _cache = array(); public function expensiveLookup ($ x) {if (! isset (self :: $ _ cache [$ x]) {self :: $ _ cache [$ x] = $ this -> _ lookup ($ x);} return self :: $ _cache [$ x];}} ' – PatrikAkerstrand

Powiązane problemy