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.
This declaration may include an initialization, but this initialization must be a constant value --that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.
Like any other PHP static variable, static properties may only be initialized using a literal or constant [...] provided they can be evaluated at compile time.
Like any other PHP static variable, static properties may only be initialized using a literal or constant [...] provided they can be evaluated at compile time.
A więc zmienne statyczne mogą być zainicjowane wartością skalarną typu Integer, Float, String 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
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