Superglobálne premenné
Superglobálne premenné sa používajú na odovzdávanie globálneho stavu aplikácie a komunikácie HTTP.
Hlavnou výhodou týchto premenných je, že sú vždy a všade k dispozícii. V praxi ide o polia hodnôt, v ktorých pristupujeme ku konkrétnym informáciám pomocou indexu. V rôznych kontextoch sa dostupnosť kľúčov môže líšiť (vysvetlené nižšie).
Typy superglobálnych premenných
Všetky superglobály v PHP sú polia a označujú sa znakom dolára, za ktorým nasleduje podčiarkovník (okrem $GLOBALS) a veľké písmená.
V PHP 7 sú najmä tieto možnosti:
| Premenná | Popis |
|---|---|
$_GET |
Parametre URL zasielané metódou GET |
$_POST |
Údaje formulára odoslané prostredníctvom POST. Všimnite si, že môže sa v ajaxe správať inak. |
$_REQUEST |
Údaje formulára odoslané ľubovoľnou metódou ($_GET, $_POST a $_REQUEST). |
$_FILES |
Technické informácie o aktuálne nahraných súboroch, napríklad prostredníctvom konštrukcie <input type="file"> |
$_SERVER |
Nastavenia webového servera, IP adresa, konfigurácia... líši sa v závislosti od prostredia (pri volaní PHP skriptu z Terminálu bude obsahovať iné hodnoty a napríklad informácia o aktuálnej požiadavke bude chýbať). |
$_COOKIE |
Nakonfigurované cookies. |
$_SESSION |
Údaje relácie (relácia), ak existujú a boli nastavené v minulosti. |
$GLOBALS |
Upozornenie, neobsahuje podčiarkovník v názve! Ide o takzvanú global-variable a alternatívny zápis pre kľúčové slovo global. Ak máte v aplikácii globálnu premennú $variable, môžete k nej pristupovať aj pomocou konštrukcie $GLOBALS["variable"]. Používanie globálnych premenných je však zlé a nečisté riešenie, takže to radšej nerobte. |
$_ENV |
Informácie o aktuálnom prostredí, v ktorom je PHP spustené. |
Zoznam všetkých existujúcich hodnôt je jednoduchý:
foreach ($_SERVER as $key => $value {echo $key . ': ' . $value . '<br>';}
Poznámka: Nie všetky indexy musia vždy existovať (napríklad ak skript spustí cron v režime CLI, index s adresou URL stránky alebo IP adresou požiadavky nebude existovať).
Prístup k premenným
Odporúčam, aby všetky globálne premenné (okrem $_SESSION) boli len na čítanie. Je to preto, lebo obsahujú globálne údaje aplikácie a iný kód ich môže brať do úvahy (napríklad iná nainštalovaná knižnica).
Ďalšou nevýhodou globálneho stavu je, že sa nemôžete vždy spoľahnúť na presné hodnoty, aj keď existujú, takže by ste mali vždy kontrolovať ich kľúče pomocou konštrukcie isset().
Ak chcete uložiť nový súbor cookie, použite funkciu setcookie() a nevkladajte hodnotu priamo. Je to preto, že je určený len na čítanie.
Získané skúsenosti
Nikdy slepo nedôverujte hodnotám superglobálnych premenných!
Používateľ môže pomocou adresy URL a odoslaných hlavičiek ovplyvniť spôsob nastavenia hodnôt. Všetky vstupy by sa mali vždy starostlivo overiť.
Register globals - problémy so starou verziou PHP
V starej verzii PHP (do verzie 5.4.0) existovala špeciálna direktíva register-globals (nastaviteľná v súbore php.ini), ktorá spôsobila, že všetky odovzdané parametre v URL boli automaticky zaregistrované ako premenné.
Napríklad:
Používateľ prišiel na adresu URL: https://example.com/script.php?var=24
PHP automaticky vytvorilo v skripte premennú $var s hodnotou 24.
Takže to fungovalo klasicky:
echo $var;
Ktokoľvek by teda mohol do skriptu vložiť akúkoľvek premennú a zmeniť jej obsah. Samozrejme, bezpečnosť nebola vždy prioritou. Nie celkom.
Iné zdroje
Podrobnejší popis nájdete v oficiálnej príručke.