Czym się różni
static $stala = 0;
od
const STALA = 0;
?
Czym się różni
static $stala = 0;
od
const STALA = 0;
?
Pierwsza opcja to nie stała.
@spartanPAGE: zrobiłem takie coś i nie ma różnicy w każdym wychodzi 0
<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
function test2()
{
$a = 0;
echo $a;
$a++;
}
test();
test2();
?>
takie coś znalazłem:
Zmienna statyczna (tak samo jak funkcja) to pewne miejsce w pamięci komputera i jest związane z klasą, nie z obiektem, co skutkuje tym, że nie musi istnieć egzemplarz klasy:
To odpal te funkcje 2 razy, zobaczysz różnicę.
Plus, do const nie przypiszesz ponownie wartości, do static jak najbardziej.
Stała to, jak brzmi nazwa, pewna stała, niemodyfikowalna wartość - w odróżnieniu od pola statycznego, które możesz zmieniać:
<?php
class Foo {
public static $bar;
public const BAR = 132;
}
Foo::$bar = 1;
Foo::$bar = 2;
Foo::$bar = 3;
Foo::BAR = 4; // błąd: nie można zmienić wartości stałej
Jest więcej różnic, niż tylko to, że wartość stałej nie można zmienić, a zmienną statyczną można. Stałe możesz definiować poza funkcjami i klasami funkcją define, a zmiennej statycznej już w ten sposób nie zadeklarujesz, dlatego stałych używa się np. do definicji pewnych kluczowych parametrów aplikacji podczas startupu. Na przykład może to być stała kosmiczna, albo stała oznaczająca przyspieszenie grawitacyjne, albo masa molowa jakiegoś pierwiastka chemicznego, albo domyślna stawka VAT w sklepie internetowym, etc.
a zmiennej statycznej już w ten sposób nie zadeklarujesz
Ależ jak najbardziej można - zmienne globalne są podzbiorem zmiennych statycznych.
Nie jest możliwe natomiast utworzenie dynamicznie (w trakcie runtime'u) statycznego pola, tak samo jak nie można dynamicznie utworzyć nowej stałej w klasie.
@spartanPAGE: odpaiłem dwa razy i nic.
@Patryk27 @TomRZ dobra to już rozumiem a czym różni się static od zwykłej zmiennej?
W przypadku zmiennych, modyfikator static
powoduje, że wartość danej zmiennej jest zachowywana między kolejnymi uruchomieniami funkcji - prosty przykład (https://ideone.com/ZlV7WQ):
<?php
function testZmiennejLokalnej() {
$jakasZmienna = 0;
$jakasZmienna++;
echo 'testZmiennejLokalnej() :: ' . $jakasZmienna . PHP_EOL;
}
function testZmiennejStatycznej() {
static $jakasZmienna = 0;
$jakasZmienna++;
echo 'testZmiennejStatycznej() :: ' . $jakasZmienna . PHP_EOL;
}
testZmiennejLokalnej();
testZmiennejLokalnej();
echo PHP_EOL;
testZmiennejStatycznej();
testZmiennejStatycznej();
Każde uruchomienie funkcji testZmiennejLokalnej
tworzy od nowa zmienną jakasZmienna
- dlatego zawsze testZmiennejLokalnej
wyświetli 1
.
Funkcja testZmiennejStatycznej
operuje za to cały czas na tej samej zmiennej, nie resetując jej wartości przy każdym uruchomieniu - dlatego testZmiennejStatycznej
wyświetli 1
, a potem 2
.
W przypadku pól klasy, modyfikator static
powoduje, że dane pole przestaje być powiązane z konkretną instancją klasy - praktycznym przykładem może być (https://ideone.com/VsRqsx):
<?php
class Czlowiek {
public static $liczbaUtworzonychLudzi = 0;
public $imie;
public function __construct(string $imie) {
++self::$liczbaUtworzonychLudzi;
$this->imie = $imie;
}
}
$jan = new Czlowiek('Jan');
$ania = new Czlowiek('Ania');
echo $jan->imie . PHP_EOL;
echo $ania->imie . PHP_EOL;
echo Czlowiek::$liczbaUtworzonychLudzi . PHP_EOL;
Zauważ, że każda instancja klasy Czlowiek
(zawarta w zmiennych $jan
oraz $ania
) zawiera własne imię (jedno nie nadpisuje drugiego), podczas gdy Czlowiek::$liczbaUtworzonychLudzi
jest współdzielone.