Globální proměnné v PHP. Viditelnost proměnné PHP viditelnost proměnné rozsahu ve funkcích

Poslední aktualizace: 1.11.2015

Při používání proměnných a funkcí zvažte rozsah proměnné. Rozsah specifikuje rozsah působení a dostupnost dané proměnné.

Lokální proměnné

Lokální proměnné se vytvářejí uvnitř funkce. K takovým proměnným lze přistupovat pouze z dané funkce. Například:

V tomto případě funkce get() definuje lokální proměnnou $result . A z obecného kontextu k němu nemáme přístup, to znamená napsat $a = $result; To není možné, protože rozsah proměnné $result je omezen funkcí get(). Mimo tuto funkci proměnná $result neexistuje.

Totéž platí pro parametry funkcí: mimo funkci parametry $lowlimit a $highlimit také neexistují.

Lokální proměnné zpravidla ukládají některé mezivýsledky výpočtů, jako ve výše uvedeném příkladu.

Statické proměnné

Statické proměnné jsou podobné lokálním proměnným. Liší se tím, že po dokončení funkce se jejich hodnota uloží. Při každém volání funkce použije dříve uloženou hodnotu. Například:

K označení, že proměnná bude statická, se k ní přidá klíčové slovo static. Při třech po sobě jdoucích voláních getCounter() se proměnná $counter zvýší o jednu.

Pokud by proměnná $counter byla běžnou nestatickou proměnnou, pak by getCounter() vypsala 1 pokaždé, když byla zavolána.

K vytvoření různých čítačů se obvykle používají statické proměnné, jako ve výše uvedeném příkladu.

Globální proměnné

Někdy chcete, aby byla proměnná dostupná všude, globálně. Takové proměnné mohou uchovávat některá data společná pro celý program. Chcete-li definovat globální proměnné, použijte klíčové slovo global:1

"; ) getGlobal(); echo $gvar; ?>

Po zavolání funkce getGlobal() lze k proměnné $gvar přistupovat z kterékoli části programu.

Variabilní rozsah je kontext, ve kterém je tato proměnná definována. Většina proměnných PHP má jeden rozsah. Tento jediný rozsah (také nazývaný globální rozsah) také pokrývá zahrnuté soubory:

V tomto příkladu bude proměnná $a dostupná také uvnitř zahrnutého skriptu - main.inc .

Lokální proměnné

Definice vlastní funkce specifikuje místní působnost pro proměnnou, tzn. Jakákoli proměnná použitá uvnitř funkce je standardně omezena na místní rozsah funkce (dostupná pouze ve funkci, ve které je definována). Jak to funguje: Pro oddělení proměnných používaných v obecném kódu od proměnných používaných ve funkcích poskytuje PHP samostatné úložiště pro proměnné v každé funkci. Toto rozdělení úložného prostoru znamená, že rozsah, tedy oblast, ve které je k dispozici hodnota proměnné, je místní úložiště funkce.

Níže uvedený příklad jasně ukazuje, že proměnná deklarovaná mimo funkci se uvnitř funkce nemění. I když byste se neměli snažit pochopit, jak funkce funguje, hlavní věcí je, že má svou vlastní jedinečnou sadu proměnných:

30 ?>

V důsledku provedení tohoto fragmentu se zobrazí následující: 30.

Uvnitř funkce narození() je proměnná $věk nastavena na 1, ale nejedná se o stejnou proměnnou, která byla definována v globálním rozsahu. Když se tedy vytiskne hodnota proměnné $věk, vytiskne se původní hodnota 30. Stojí za zmínku, že lokální proměnné jsou vytvářeny v době volání funkce a po skončení funkce jsou vymazány.

Pokud skutečně chcete číst nebo měnit hodnotu globální proměnné (jak se nazývají proměnné používané v globálním rozsahu) spíše než lokální ve funkci narození(), musí být v definici funkce deklarována jako globální.

Poznámka: Aktivuje se adaptivní verze webu, která se automaticky přizpůsobí malé velikosti vašeho prohlížeče a skryje některé detaily webu pro snadné čtení. Užijte si sledování!

Ahoj milí čtenáři blogu místo na! V roce jsme se dozvěděli, že v PHP existuje funkce, naučili jsme se vytvářet vlastní funkce, předávat jim argumenty a volat je k provedení. V pokračování tématu funkcí v PHP je nutné zdůraznit následující věci:

  • Uvnitř funkce můžete použít libovolný PHP kód (cykly, podmínky, libovolné operace), včetně dalších funkcí (vestavěných i vlastních);
  • Název funkce musí začínat latinským písmenem nebo podtržítkem, za nímž následuje libovolný počet latinských písmen, číslic nebo podtržítek;
  • Všechny funkce mají globální rozsah, což znamená, že jakákoli funkce může být volána kdekoli, i když je tato funkce definována uvnitř jiné;
  • PHP nepodporuje přetěžování funkcí, není zde ani možnost předefinovat (změnit, přidat) nebo smazat vytvořenou funkci;
  • Funkce nemusí být před použitím definovány. To znamená, že pokud nejprve zavoláte funkci a teprve poté ji popíšete v kódu níže, neovlivní to výkon a nezpůsobí chyby.

Podmíněné funkce

V závislosti na podmínce můžeme vytvořit (definovat, popsat) funkci. Například:

//zavolána funkce sayHi, lze ji volat kdekoli /*funkci sayGoodbye zde nelze zavolat, protože jsme ještě nezkontrolovali podmínku a nevstoupili do konstrukce if*/ if($apply)( funkce sayGoodbye())( echo "Ahoj všichni!
"; } } /*teď můžeme zavolat říct Goodbye*/
"; }

Výsledek:

A podívejte se na tento příklad:

/*a to je to, co se stane, když zde zavoláte říct Goodbye*/Řekni sbohem(); if($apply)( funkce sayGoodbye())( echo "Ahoj všichni!
"; ) ) funkce sayHi())( echo "Ahoj všichni!
"; }

Výsledek:

Ve skutečnosti, i když pracuji, nikdy jsem nic takového nikde neviděl, ale musíte mít na paměti všechny možnosti jazyka.

Vnořené funkce

Vnořená funkce je funkce deklarovaná uvnitř jiné funkce. Příklad:

/*Tady nemůžete zavolat sayGoodbye, protože se objeví až po zavolání funkce sayHi*/ pozdravit(); /*zavolejte funkci sayHi, lze ji volat kdekoli*/ /*Teď můžeme zavolat říct Goodbye*/Řekni sbohem(); function sayHi())( echo „Ahoj všichni!
"; funkce sayGoodbye())( echo "Ahoj všichni!
"; } }

Při prvním průchodu se interpret PHP opět označí, že našel popis funkce sayHi, ale nevstoupí do jejího těla, vidí pouze název, a protože interpret nevstoupí do těla funkce sayHi, pak nemá ponětí, co definujeme uvnitř jiné funkce – sayGoodbye.

Poté se kód začne provádět, zavoláme sayHi, PHP interpret musí jít do těla funkce sayHi, aby ji provedl, a tam omylem najde popis další funkce - sayGoodbye, po které lze sayGoodbye volat kdekoli, jako mnohokrát jak chceš.

Ale stojí za to věnovat pozornost velmi jemnému bodu ve výše uvedené situaci: funkce sayHi se stává jednorázovou, protože pokud ji zavoláme znovu, PHP opět narazí na definici funkce sayGoodbye a v PHP nemůžete toto - nemůžete přepsat funkce. O tom a jak se s tím vypořádat jsem psal v předchozím článku.

V PHP se výše popsané techniky používají velmi zřídka, častěji je lze vidět například v JavaScriptu.

Variabilní rozsah

V PHP jsou přesně dva rozsahy: globální A místní. Každý programovací jazyk strukturuje jinak. Například v C++ mají sudé smyčky svůj vlastní (místní) rozsah. V PHP je to mimochodem globální rozsah. Dnes se ale bavíme o funkcích.

Funkce v PHP mají svůj vnitřní rozsah (lokální), to znamená, že všechny proměnné uvnitř funkce jsou viditelné pouze v rámci této funkce.

Takže ještě jednou: vše mimo funkce je globální rozsah, vše uvnitř funkcí je místní rozsah. Příklad:

Vážení odborníci, pozor, dotaz! Jaký bude výstup poslední instrukce? echo $jméno; ?

Jak jste sami viděli, měli jsme 2 proměnné $jméno, jeden uvnitř funkce (místní rozsah), druhý pouze v kódu (globální rozsah), poslední přiřazení k proměnné $jméno byl $name = "Rud Sergey"; Ale protože to bylo uvnitř funkce, zůstalo to tam. V globálním rozsahu bylo posledním zadáním $jméno = "Andrey"; což je to, co ve skutečnosti vidíme jako výsledek.

Tedy dvě stejné proměnné, které se ale v různém rozsahu neprolínají a neovlivňují.

Dovolím si ilustrovat rozsah na obrázku:

Během prvního průchodu interpret krátce naskenuje globální rozsah, zapamatuje si, jaké proměnné a funkce tam jsou, ale neprovede kód.

Přístup ke globálním proměnným z místního rozsahu

Co když ale stále potřebujeme přistupovat ke stejné proměnné $name z globálního rozsahu z funkce, a nejen k ní přistupovat, ale měnit ji? K tomu existují 3 hlavní možnosti. První z nich je pomocí klíčového slova globální:

"; globální $jméno; /*od této chvíle máme na mysli globální proměnnou $name*/$name = "Rud Sergey"; ) $jméno = "Andrey"; sayHi($jméno); echo $jméno; // ?

Výsledek:

Tato metoda má však nevýhodu, protože jsme přistupovali ke globální proměnné $jméno ztratili jsme (přepsali) lokální proměnnou $jméno.

Druhý způsob je použít PHP superglobální pole. PHP samo automaticky umístí každou proměnnou, kterou jsme vytvořili v globálním rozsahu, do tohoto pole. Příklad:

$jméno = "Andrey"; //Stejný jako$GLOBALS["name"] = "Andrey";

Proto:

"; $GLOBALS["name"] = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

Výsledek je stejný jako při použití klíčového slova globální:

Jen jsme tentokrát nepřepisovali lokální proměnnou, tedy proměnnou $jméno uvnitř funkce zůstává stejná a rovná se "Andrey", ale ne "Rud Sergey".

Předávání argumentů odkazem

Třetí způsob– jedná se o přenos adresy ( Odkazy) proměnné, nikoli její hodnoty. Odkazy v PHP nejsou na rozdíl od jiných programovacích jazyků příliš úspěšné. Řeknu vám však jedinou správnou možnost předání argumentu odkazem na funkci, která je běžně podporována v PHP 5.3 a výše. Existují i ​​jiné způsoby, jak pracovat s odkazy, ale fungovaly v PHP 5.2 a nižších, v důsledku toho se sami vývojáři PHP rozhodli je opustit, takže o nich nebudeme mluvit.

Takže SPRÁVNÉ předání argumentu odkazem v PHP 5.3 a vyšších se provádí následovně:

Funkce sayHi(& $name)(

V samotném popisu funkce jsme přidali ikonu ampersand (&) - tato ikona znamená, že nepřijímáme hodnotu proměnné, ale odkaz (adresu) na tuto hodnotu v paměti. Reference v PHP umožňují vytvořit dvě proměnné ukazující na stejnou hodnotu. To znamená, že když se jedna z těchto proměnných změní, změní se obě, protože odkazují na stejnou hodnotu v paměti.

A na závěr tu máme:

//nepřijímá hodnotu, ale odkaz na hodnotu echo "Dobrý den, ".$name."!
"; $name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

Výsledek:

Statické proměnné

Představte si následující situaci: musíme spočítat, kolikrát jsme se celkem pozdravili. O co se snažíme:

"; $c++; // zvýšení počítadla o 1


Výsledek:

Variabilní $c nepamatuje si svůj význam, pokaždé se vytváří znovu. Musíme vytvořit naši místní proměnnou $c po provedení funkce si zapamatovali jeho hodnotu, k tomu používají klíčové slovo statický:

// čítač, statický echo "Dobrý den, ".$name."!
"; $c++; // zvýšení počítadla o 1 echo "Právě jsem řekl ahoj". $c "jednou.


"; ) sayHi("Rud Sergey"); sayHi("Andrey"); sayHi("Dmitry");

Výsledek:

Vrácení hodnot

Funkce mají tak pohodlnou věc, jako je vracení hodnot. To je, když funkce místo toho, aby něco vytiskla na obrazovku, vloží vše do proměnné a tuto proměnnou nám dá. A už řešíme, co s tím. Vezměme si například tuto funkci, odmocní číslo:

Výsledek:

Udělejme to tak, že místo zobrazení na obrazovce vrátí výsledek provedení. Chcete-li to provést, použijte klíčové slovo return:

Výsledek:

Nyní to můžeme použít různými způsoby:

//vypíše výsledek echo"
"; $num = getSquare(5); echo $num;

Výsledek:

Upozorňujeme, že klíčové slovo vrátit se nevrátí pouze hodnotu, ale zcela přeruší funkci, tedy veškerý kód, který je pod klíčovým slovem vrátit se se nikdy nenaplní. Jinými slovy, návrat pro funkce také funguje jako přestávka pro smyčky:

echo "PHP se ke mně nikdy nedostane :(";) echo getSquare(5); //vypíše výsledek echo"
"; $num = getSquare(5); // přiřadí výsledek proměnné echo $num; // zobrazení proměnné na obrazovce

Výsledek:

To znamená vrátit se– to je také výstup z funkce. Může být použit bez návratové hodnoty, jen kvůli výstupu.

Rekurzivní funkce

Rekurzivní funkce je funkce, která volá sama sebe. Rekurze se nepoužívá často a je považována za operaci náročnou na zdroje (pomalu). Stává se však, že použití rekurze je nejzřejmější a nejjednodušší možností. Příklad:

"; if($číslo< 20){ // aby se rekurze nestala nekonečnou počítProsím(++$číslo); // funkce countPlease volala sama sebe) ) countPlease(1);

Výsledek:

Pokud víte, jak se obejít bez rekurze, pak je lepší to udělat.

Silné psaní v PHP (upřesnění typu)

PHP dělá malé krůčky směrem k silnému psaní, takže můžeme předem specifikovat, jaký typ má funkce mít (tzv tip-nápověda):

Výsledek:

Zachytitelná závažná chyba: Argument 1 předaný do countPlease() musí být pole, zadané celé číslo, volané v /home/index.php na řádku 7 a definované v /home/index.php na řádku 3

Chyba nám říká, že funkce očekává přijetí pole, ale místo toho jí předáváme číslo. Bohužel zatím můžeme specifikovat pouze typ pro (array) a s PHP 5.4 jsme přidali i takovou možnost jako povolatelný:

Volatelné zkontroluje, zda lze předávanou hodnotu volat jako funkci. Volatelné může být buď jméno funkce určené řetězcovou proměnnou, nebo objekt a název volané metody. Ale o objektech a metodách si povíme později (toto je část objektově orientovaného programování), ale funkce už znáte. Nemohu vám ukázat výsledek práce, protože aktuálně mám PHP 5.3, ale bylo by to:

Zavolána funkce getEcho

Použití argumentů s proměnnou délkou

A na závěr ještě jedna velmi zřídka používaná nuance. Představte si situaci: předáme argumenty funkci, ačkoli jsme je ve funkci nepopsali, například:

Výsledek:

Jak vidíte, nejsou tam žádné chyby, ale naše předané argumenty nejsou nikde použity. To ale neznamená, že jsou pryč - stále byly předány do funkce a můžeme je použít; jsou k tomu vestavěné funkce PHP:

func_num_args()- Vrátí počet argumentů předaných funkci
func_get_arg(pořadové číslo)- Vrátí prvek ze seznamu argumentů
func_get_args()- Vrátí pole obsahující argumenty funkce

"; echo func_get_arg(0) ; ) $věk = 22; getEcho("Rud Sergey", $věk);

Výsledek:

Závěr

Dnešní článek je závěrečný na téma funkce v PHP. Nyní si můžete být jisti úplností svých znalostí o tomto tématu a můžete s jistotou používat funkce pro své potřeby.

Pokud má někdo touhu se v tom zdokonalit, ale netuší, jak na to, nejlepším způsobem by bylo napsat hotové (vestavěné) funkce PHP, můžete si například napsat vlastní funkci count() nebo jakékoliv jiné.

Děkuji všem za pozornost a zase se uvidíme! Pokud vám něco není jasné, neváhejte se zeptat v komentářích!

Rozsah proměnné je kontext, ve kterém je proměnná definována. Ve většině případů mají všechny proměnné PHP pouze jeden rozsah. Tento jediný rozsah také pokrývá zahrnuté a požadované soubory. Například:

$a = 1;
zahrnují "b.inc" ;
?>

Zde bude proměnná $a dostupná uvnitř zahrnutého skriptu b.inc. Definice (tělo) uživatelem definované funkce však určuje místní rozsah této funkce. Jakákoli proměnná použitá ve funkci je ve výchozím nastavení omezena na místní rozsah funkce. Například:

$a = 1; /* globální rozsah */

Funkční test()
{
echo $a ; /* odkaz na proměnnou místního rozsahu */
}

Test();
?>

Tento skript nevygeneruje žádný výstup, protože příkaz echo ukazuje na lokální verzi proměnné $a a v tomto rozsahu jí nebyla přiřazena hodnota. Možná jste si všimli, že se to od C trochu liší v tom, že globální proměnné v C jsou automaticky dostupné funkcím, pokud nebyly přepsány lokální definicí. To může způsobit určité problémy, protože lidé mohou náhodně změnit globální proměnnou. Pokud má být v PHP použita globální proměnná v rámci funkce, musí být deklarována jako globální v rámci definice funkce.

Klíčové slovo globální

Nejprve příklad použití globální:

Příklad č. 1 Použití globální

$a = 1;
$b = 2;

funkce Suma()
{
globální $a, $b;

$b = $a + $b ;
}

Součet();
echo $b ;
?>

Vypíše se výše uvedený skript 3 . Jakmile jsou $a a $b definovány jako globální uvnitř funkce, všechny odkazy na kteroukoli z těchto proměnných budou ukazovat na jejich globální verzi. Počet globálních proměnných, které může funkce zpracovat, není nijak omezen.

Druhým způsobem přístupu k proměnným globálního rozsahu je použití speciálního pole definovaného PHP, $GLOBALS . Předchozí příklad by se dal přepsat takto:

$GLOBALS je asociativní pole, jehož klíč je název a hodnota je obsah globální proměnné. Všimněte si, že $GLOBALS existuje v jakémkoli rozsahu, protože $GLOBALS je superglobální. Níže je uveden příklad demonstrující schopnosti superglobálů:

Příklad č. 3 Superglobálové a rozsah

funkce test_global()
{
// Většina předdefinovaných proměnných není
// "super" a bude dostupný v místní oblasti
// viditelnost, funkce vyžadují zadání "global".
globální $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS["jméno"];

// Superglobálové jsou k dispozici v libovolném rozsahu
// viditelnost a nevyžadují zadání "global".
// Superglobals jsou dostupné od PHP 4.1.0 a
// použití HTTP_POST_VARS je zastaralé.
echo $_POST ["jméno" ];
}
?>

Komentář:

Použití klíčových slov globální mimo funkci není chyba. Lze jej použít v souboru, který je součástí funkce.

Pomocí statického ( statický) proměnné

Další důležitou vlastností variabilního rozsahu je statický variabilní. Statická proměnná existuje pouze v lokálním rozsahu funkce, ale neztrácí svou hodnotu, když provádění programu tento rozsah opustí. Zvažte následující příklad:

Příklad č. 4 Demonstrace potřeby statických proměnných

funkční test()
{
$a = 0;
echo $a ;
$a++;
}
?>

Tato funkce je docela k ničemu, protože pokaždé, když je volána, nastaví $a na 0 a výstupy 0 . Přírůstek proměnné $a ++ zde nehraje roli, protože proměnná $a při ukončení funkce zmizí. Chcete-li napsat užitečnou počítací funkci, která neztratí aktuální hodnotu počítadla, je proměnná $a deklarována jako statická:

Příklad č. 5 Příklad použití statických proměnných

funkční test()
{
statické $a = 0 ;
echo $a ;
$a++;
}
?>

Nyní bude $a inicializováno pouze při prvním volání funkce a při každém volání funkce test() vytiskne hodnotu $a a zvýší ji.

Statické proměnné také umožňují pracovat s rekurzivními funkcemi. Rekurzivní funkce je taková, která volá sama sebe. Při psaní rekurzivní funkce musíte být opatrní, protože existuje možnost, že rekurze bude nekonečná. Musíte zajistit, že existuje adekvátní způsob ukončení rekurze. Následující jednoduchá funkce počítá až 10 rekurzivně a pomocí statické proměnné $count určí, kdy přestat:

Komentář:

Statické proměnné lze deklarovat tak, jak je ukázáno v předchozím příkladu. Pokus o přiřazení hodnot těmto proměnným, které jsou výsledkem výrazů, způsobí chybu zpracování.

Příklad č. 7 Deklarace statických proměnných

funkce foo ()(
static $int = 0 ; // že jo
static $int = 1 + 2 ; // nesprávné (protože je to výraz)
static $int = sqrt(121); // nesprávné (protože toto je také výraz)

$int++;
echo $int ;
}
?>

Komentář:

Statické deklarace jsou vyhodnocovány během kompilace skriptu.

Odkazy na globální ( globální) a statické ( statický) proměnné

Zend Engine 1, který pohání PHP 4, zachází se statickými a globálními proměnnými modifikátory jako s odkazy. Například skutečná globální proměnná vložená do rozsahu funkce zadáním klíčového slova globální, ve skutečnosti vytváří odkaz na globální proměnnou. To může vést k neočekávanému chování, jak ukazuje následující příklad:

funkce test_global_ref() (
globální $obj ;
$obj = &new stdclass ;
}

funkce test_global_noref() (
globální $obj ;
$obj = new stdclass ;
}

test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>

Výsledek spuštění tohoto příkladu: get_instance_noref () (
statický $obj ;

Echo "Statický objekt:";
var_dump($obj);
if (!isset($obj )) (
// Přiřazení objektu ke statické proměnné
$obj = new stdclass ;
}
$obj -> property++;
vrátit $obj ;
}

$obj1 = get_instance_ref();
$stále_obj1 = get_instance_ref();
echo "\n" ;
$obj2 = get_instance_noref();
$stále_obj2 = get_instance_noref();
?>

Výsledek spuštění tohoto příkladu:

Statický objekt: NULL
Statický objekt: NULL

Statický objekt: NULL
Statický objekt: object(stdClass)(1) (
["vlastnictví"]=>
int(1)
}

Tento příklad ukazuje, že když přiřadíte odkaz na statickou proměnnou, nepřiřadí se památný když funkci zavoláte &get_instance_ref() podruhé.

Chcete-li vytvořit plnohodnotný web s širokou nabídkou funkcí, musíte toho hodně vědět. PHP však může dát webu skutečnou jedinečnost. Globální proměnná se v tomto programovacím jazyce nepoužívá často, ale někdy je velmi užitečné vědět, jak funguje.


V tomto článku budeme studovat, co přesně je globální proměnná a jak funguje.

Globální proměnná: rozsah

Kontext, ve kterém je proměnná definována, se nazývá její rozsah. Proměnné mají obvykle pouze jeden rozsah. Když jsou globální proměnné v PHP načteny z jiných souborů, mohou být vyžadovány nebo zahrnuty. Ve výchozím nastavení jsou omezeny na místní rozsah funkce. Jak můžete proměnnou zviditelnit pro soubory za jejími hranicemi a také ji umět používat? To je přesně důvod, proč PHP poskytuje globální proměnnou. Klíčové slovo je zde „globální“. Jak deklarovat globální proměnnou v PHP? K dosažení tohoto cíle je třeba použít slovo „globální“. Musí být umístěn bezprostředně před proměnnou, kterou chcete změnit na globální. Vypadá to asi takto: globální „proměnná“. Po implementaci instrukcí tohoto druhu bude s daty schopen pracovat naprosto jakýkoli soubor.

Pokud jsou někde odkazy na tuto proměnnou, bude program věnovat pozornost globální verzi. Proč se používá tak zvláštní formulace? Jde o to, že současně mohou existovat i lokální verze. Budou ale přístupnější výhradně v souborech, ve kterých jsou deklarovány. Pro zbytek budou platit globální proměnné třídy PHP. Zde je třeba jednat velmi opatrně a opatrně. Abychom předešli jakýmkoli pochybnostem, uveďme jednoduchý příklad, jak by mohly vypadat: globální a. Pokud má jeden soubor přístup k více proměnným, může to způsobit konflikt. Zde však nelze s jistotou říci, zda bude načtena globální nebo lokální proměnná, nebo zda dojde k chybě. Pokud to napíšete do funkce, neměly by nastat žádné problémy. Použití proměnné mimo hranice funkce bude problematické. Proto je potřeba velmi pečlivě sledovat strukturu kódu a ujistit se, že nikde nejsou žádné předpoklady pro konflikt.

Globální proměnné: Jiný zápis
Existují jiné způsoby, jak nastavit globální proměnné? Ano, a ne sám. Nejprve se podíváme na $GLOBALS. Je to asociativní pole, ve kterém je klíčem jméno. Jako hodnota se použije obsah globální proměnné. Stojí za zmínku, že po deklaraci toto pole existuje v jakémkoli rozsahu. To dává důvod považovat ji za superglobální. Vypadá to takto: $GLOBALS ['Variable'].

Superglobálové
V každém programovacím jazyce existují názvy, které jsou vyhrazeny pro jednotlivé funkce. V PHP prostě není možné vytvořit globální proměnné stejného jména. Tento programovací jazyk má své vlastní vlastnosti. Například je obzvláště důležité, aby předdefinované proměnné neměly předponu „super“. To znamená, že nejsou dostupné ve všech lokalitách. Jak lze tuto situaci napravit? Chcete-li zpřístupnit předdefinovanou proměnnou v nějaké místní síti, musíte ji deklarovat takto: globální "proměnná". To již bylo zmíněno dříve. Není to však tak úplně pravda. Podívejme se na skutečný příklad:
Globální $HTTP_POST_VARS; echo $HTTP_POST_VARS ['název'].
Cítíte ten rozdíl? Stojí za to mít na paměti, že v PHP musí být v rámci funkce použita globální proměnná. Může být také umístěn v souboru, který je v něm obsažen.

Zabezpečení a odkazy
Jak sami vidíte, vytvoření globální proměnné v PHP není problém. Existují však nějaká specifika týkající se odkazů? Při použití globálních proměnných je možné nějaké neočekávané chování. Před podrobnějším prostudováním této problematiky je ale nutné odbočit do pozadí. Direktiva register_globals byla ve verzi 4.2 ve výchozím nastavení změněna z povoleno na vypnuto. Pro mnoho uživatelů je to zcela nedůležité a marně, protože na tom přímo závisí bezpečnost vyvíjeného produktu. Pokud potřebujete vytvořit globální proměnnou, pak direktiva PHP toto nastavení přímo neovlivní. Nesprávné použití se však může stát bezpečnostním rizikem. Pokud je tedy například register_globals ve stavu povoleno, budou před spuštěním kódu inicializovány různé potřebné proměnné. Proto se jej rozhodli vypnout. Proč globální proměnná vděčí za velkou část svého stavu dané směrnici? Problém je, že když byl povolen, vývojáři nebyli vždy schopni odpovědět na otázku, odkud pochází, ale na druhou stranu to značně usnadnilo proces psaní kódu. Zároveň taková organizace vytvářela určité ohrožení bezpečnosti. Aby se předešlo směšování dat a chybám, byla směrnice deaktivována. Nyní se podívejme na příklad nebezpečného kódu. Podíváme se také na to, jak můžete odhalit případy, kdy je deklarace globální proměnné PHP doprovázena pokusem o nahrazení informace. To je nutné k vytvoření stabilních pracovních stránek, které nemůže napadnout první uživatel, který na ně narazí.

Nebezpečné kódy
Nastavme proměnnou na hodnotu true pro uživatele, kteří mají oprávnění:
If (authenticate_user()) ($authoriza=true;) if ($authorize) (včetně „/vysoce/citlivá/data.php“;). Proměnná v tomto stavu může být nastavena automaticky. Vzhledem k tomu, že data lze jednoduše nahradit a zdroj jejich původu není stanoven, může takovou kontrolou projít prakticky každý uživatel a vydávat se za kohokoli. Útočník, je-li to žádoucí, může narušit logiku celého skriptu. Pokud změníte hodnotu direktivy, kód bude fungovat správně. To je přesně to, co musíme udělat. Inicializace proměnných však není jen dobrou praxí mezi programátory, ale také zaručuje stabilitu skriptu.

Spolehlivá varianta
Chcete-li tohoto cíle dosáhnout, můžete zkusit deaktivovat direktivu nebo napsat složitější kód, například takto: if (isset($_SESSION ['username'])) (echo „Ahoj“ ($_SESSION ['username' ])“;) jinak (ozvěna „Ahoj hoste“; ozvěna „Vítejte!“;). V tomto případě bude obtížné provést náhradu. Nicméně je to možné. Chcete-li to provést, musíte se předem postarat o dostupnost nástrojů rychlé reakce. Pokud potřebujete do PHP zahrnout globální proměnné, můžete použít následující nástroj: pokud přesně víte, v jakém rozsahu bude hodnota přijata, pak ji můžete napsat tak, že skript tuto skutečnost porovnáním ověří. To samozřejmě také nemůže zaručit 100% ochranu proti záměně hodnoty. Procházení možných možností však výrazně zkomplikuje provoz.

Jak odhalit pokus o spoofing?
Nyní se podívejme, zda jste správně pochopili vše, co bylo dříve napsáno. Globální proměnné ve funkci budete muset deklarovat sami. Toto je druh domácího úkolu. Nejprve je zde kód:

Uveďme několik vysvětlení. Proměnná C_COOKIE je převzata ze spolehlivého zdroje. Aby bylo zajištěno, že výsledek odpovídá očekávání, je zkontrolována hodnota proměnné. Pokud nastanou problémy, administrátor obdrží upozornění. Pokud se nic nestane, nebudou podniknuty žádné kroky.