niedziela, 6 października 2019

Zmienne statyczne

Zmienna deklarowana ze słowem kluczowym static funkcjonuje w lokalnym zakresie, ale nie traci swojej wartości po wykonaniu funkcji w której się znajduje. 

function increaseValue(): int {
    static $a = 0;
    $a++;
    return $a;
}

increaseValue();
increaseValue();
increaseValue();
increaseValue();

var_dump(increaseValue()); // 5

Można by stwierdzić, że linia static $a = 0; wykonywana jest tylko raz w czasie kompilacji. 

function getObject() {
    static $object;
    
    if (false === is_object($object)) {
        $object = new StdClass();
        $object->a = 0;
    } 
    return ++$object->a;
}

getObject();

getObject();
getObject();
getObject();
var_dump(getObject()); // int(5) 

Podczas bawienia się zmiennymi statycznymi nie mogłem od razu przypisać do zmiennej instancji obiektu, ani funkcji anonimowej - dostawałem tylko: 

// FATAL ERROR Constant expression contains invalid operations on line number x

Nie jestem przekonany, o co dokładnie chodzi, powyższe rozwiązanie jest jakimś wyjściem, a raczej obejściem sytuacji. Zakładam, że jest coś na rzeczy z compilation-time gdzie do dyspozycji mamy jedynie typy proste, ewentualnie tablice.

function someAction() {
    $b = 15;
    static $a = $b;
}
someAction();

Zadeklarowanie zmiennej statycznej z wartością będącą inną zmienną zwraca jednak dokładnie taki sam błąd. Dopiero teraz powiązałem ze sobą fakty, że ma to wiele wspólnego z deklarowaniem pól w klasie - tam też nie można na start - przy deklaracji sygnatury pola - przypisać obiektu czy funkcji anonimowej.  



A więc zmienne statyczne mogą być zainicjowane wartością skalarną typu IntegerFloatString oraz Array, bądź typem specjalnym NULL za pomocą literału bądź stałej. Od wersji PHP 5.6 - do zmiennych statycznych można przypisywać wyrażenia np. 5 + 6.

const CONSTANT_1 = 100;
define('CONSTANT_2', 200);

function someFunction() {
    static $a = CONSTANT_1;
    static $b = CONSTANT_2;
    return $a + $b;
}

echo someFunction(); // 300








Brak komentarzy:

Prześlij komentarz