Táto stránka je úplným zhrnutím fungovania premenných v jazyku PHP. Text je písaný mierne odborným štýlom a začiatočníci mu nemusia úplne porozumieť. Ak vás zaujímajú úplné základy, prečítajte si príručku pre začiatočníkov a principy písania premenných.
Premenná je virtuálne miesto v operačnej pamäti, je definovaná pomocou name
a data type
. V rámci dátového typu má potom premenná určitý obsah
.
PHP interne reprezentuje premenné ako takzvanú hashovaciu tabuľku, t. j. všetky premenné sú uložené v tabuľke, v ktorej sa dá veľmi rýchlo vyhľadávať, takže čas potrebný na prístup ku každej premennej je takmer konštantný.
Príklady písania:
$a = 10;$b = 'cat';$c = true;
Každý riadok vo vzorke označuje definíciu jednej premennej. Názov každej premennej začína znakom dolára $
, za ktorým nasleduje samotný názov. Znak rovnosti možno použiť na priradenie hodnoty premennej.
Interne sa premenné uložia do pamäte ako hašovacia tabuľka:
Názov | Typ | Skratka | Hodnota |
---|---|---|---|
$a |
integer | int | 10 |
$b |
string | string | cats |
$c |
boolean | bool | true |
Premenné sú klasifikované podľa prístupových práv a použitia:
Globálne premenné
a premenné
by sa nemali používať, pretože prispievajú k nečitateľnosti kódu a "magickému" (neočakávanému) správaniu aplikácie.*Premenné môžu obsahovať čokoľvek, čo umožňuje ich aktuálny dátový typ. Ak typ údajov nie je zadaný, určí sa automaticky na základe obsahu (to sa neodporúča, pretože to môže viesť k chybám).
Dátové typy pracujú nezávisle, takže môžeme použiť takmer akýkoľvek typ. Ak však chceme vykonať nejakú operáciu zlúčenia, musíme vždy zabezpečiť prevod do jedného formátu.
Dobrým príkladom je napríklad sčítanie a násobenie čísel:
$x = 5; // celé číslo$y = 3; // celé číslo$z = $y + $y; // premenná $z bude zložená na základe viacerých premenných
V tomto prípade PHP stojí pred otázkou, aký dátový typ bude mať novo vytvorená premenná $z
. Ak ide o rovnaký dátový typ a operácia je možná, dátový typ sa dedí.
Niekedy však môžeme vykonať operáciu s viacerými dátovými typmi:
$x = 1; // celé číslo$y = 3.14159; // float$z = $y + $y; // float
V tomto prípade zlúčime celé číslo a float. Výstupom bude desatinné číslo, preto sa použije float. V tomto prípade PHP vykoná niečo, čo sa nazýva dynamické rozdelenie.
Na toto správanie sa však nemôžeme vždy spoliehať. Ako by ste napríklad chceli zlúčiť číslo a reťazec?
$x = 256; // celé číslo$y = "Ahoj!; // float$z = $y + $y; // ???
PHP je interpretovaný jazyk, takže má v porovnaní s inými programovacími jazykmi niektoré zvláštnosti, jednou z nich je, že nemusíme špecifikovať dátové typy premenných, t. j. každá premenná dynamicky mení svoj dátový typ podľa svojho obsahu (ak nie je uvedené inak). Napriek tomu je dobré poznať aspoň základné dátové typy, čo je užitočné najmä pri optimalizácii aplikácií alebo pri práci s databázami.
Zápis môže vyzerať takto:
$x = (int) 25; // vytvorí premennú typu integer
Aký dátový typ bude mať premenná $x
, ak poznáme len tento kus zdrojového kódu?
$x = $y;
Závisí to od dátového typu premennej $y
, od ktorej sa zdedí hodnota aj jej dátový typ. V tomto prípade nepoznáme premennú $x
, takže nemôžeme pokračovať vo vyhodnocovaní kódu a vyhodí sa chybové hlásenie.
Majme nasledujúce 2 premenné:
$x = 10;$y = '10';
Aký je rozdiel medzi obsahom premenných $x
a $y
?
Premenná $x
je číslo, $y
je reťazec (obsahuje "1" a "0"), takže ak premennú len uložíme do pamäte a nevykonáme žiadnu operáciu, ktorá by ovplyvnila jej hodnotu. Napríklad nasledujúce 2 položky vrátia rovnaký výsledok:
echo $x + 5; // vytlačí 15echo $y + 5; // vytlačí 15
V druhom prípade dochádza k takzvanému dynamickému prepísaniu, t. j. premenná konvertuje svoj dátový typ tak, aby sa s ňou mohla vykonať výpočtová operácia. Na toto správanie sa nedá vždy spoľahnúť a ide skôr o opravné správanie, ktoré slúži na opravu zle napísaných začiatočníckych skriptov. Ak je to možné, vždy zapisujte čísla s dátovým typom na ukladanie čísel, pretože to zvyšuje ich presnosť a uľahčuje ich použitie v budúcnosti.
Poznámka: Je dôležité poznamenať, že dátové typy nemôžeme konvertovať úplne ľubovoľne, takže to nie je vždy možné. Ak prepíšete dátový typ na iný (nekompatibilný), buď sa konverzia vôbec nemusí uskutočniť, alebo sa pôvodný obsah môže poškodiť alebo úplne zničiť a nahradiť iným. Ak napríklad prepíšete reťazec na celé číslo (a do premennej uložíte nejaký text, ktorý nie je číslom), namiesto číselnej hodnoty sa do premennej uloží hodnota
1
.
Všetky reťazce sú interne uložené ako pole znakov. To znamená, že každý znak má svoj vlastný index a možno sa naň odkazovať. Ak nezadáme index, pracuje sa s celým reťazcom.
$x = "Programujme v PHP!;$n = 3;echo $x; // vypíše sa celý obsah premennej $xecho $x[0]; // vypíše nulový znak premennej $xecho $x[$n]; // vypíše n-tý znak premennej $x
Poznámka: Čísla PHP od nuly, t. j. nulový znak je 'P' a prvý znak je 'r'.
Okrem toho sa znaky prepínajú po bajtoch. Napríklad znak "no" v kódovaní UTF-8 je dlhý 2 bajty, takže index znaku v reťazci nebude pri posúvaní zodpovedať skutočnej pozícii a na uloženie znaku sa použijú 2 indexy.
Existencia prvku poľa by sa mala vždy overiť pomocou funkcie isset()
:
if (isset($x[$n])) {echo $x[$n];}
Prípadne ho môžete pekne zapísať pomocou ternárneho operátora:
echo $x[$n] ?? '';
Majme nasledujúcu premennú:
$q = "Lorem ipsum, ...;
A potom skopírujte jej hodnotu do ďalšej premennej:
$qi = $q;
Našťastie nedôjde k žiadnemu kopírovaniu a PHP len uloží odkaz na hodnotu do tabuľky hash. Hodnota sa skutočne skopíruje len vtedy, keď sa má zmeniť hodnota jednej z premenných. O toto správanie sa stará komponent, ktorý sa všeobecne nazýva Garbridge collector.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | sk