static $stala czy const STALA

0

Czym się różni

static $stala = 0;

od

const STALA = 0;

?

0

Pierwsza opcja to nie stała.

0

@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:

0

To odpal te funkcje 2 razy, zobaczysz różnicę.
Plus, do const nie przypiszesz ponownie wartości, do static jak najbardziej.

1

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
0

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.

0

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.

0

@spartanPAGE: odpaiłem dwa razy i nic.
@Patryk27 @TomRZ dobra to już rozumiem a czym różni się static od zwykłej zmiennej?

2

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1