Globálne premenné v PHP. viditeľnosť premennej PHP viditeľnosť premennej rozsahu vo funkciách

Posledná aktualizácia: 1.11.2015

Pri používaní premenných a funkcií zvážte rozsah premenných. Rozsah špecifikuje rozsah pôsobenia a dostupnosť danej premennej.

Lokálne premenné

Lokálne premenné sa vytvárajú vo vnútri funkcie. K takýmto premenným je možné pristupovať iba v rámci danej funkcie. Napríklad:

V tomto prípade funkcia get() definuje lokálnu premennú $result . A zo všeobecného kontextu sa k nemu nedostaneme, to znamená, že napíšte $a = $výsledok; Nie je to možné, pretože rozsah premennej $result je obmedzený funkciou get(). Mimo tejto funkcie premenná $result neexistuje.

To isté platí pre parametre funkcie: mimo funkcie neexistujú ani parametre $lowlimit a $highlimit.

Lokálne premenné spravidla ukladajú niektoré medzivýsledky výpočtov, ako v príklade vyššie.

Statické premenné

Statické premenné sú podobné lokálnym premenným. Líšia sa tým, že po dokončení funkcie sa ich hodnota uloží. Pri každom volaní funkcie sa použije predtým uložená hodnota. Napríklad:

Na označenie, že premenná bude statická, sa k nej pridá kľúčové slovo static. Pri troch po sebe nasledujúcich volaniach funkcie getCounter() sa premenná $counter zvýši o jednu.

Ak by premenná $counter bola obyčajná nestatická premenná, potom by funkcia getCounter() vypísala 1 pri každom volaní.

Na vytvorenie rôznych počítadiel sa zvyčajne používajú statické premenné, ako v príklade vyššie.

Globálne premenné

Niekedy chcete, aby bola premenná dostupná všade, globálne. Takéto premenné môžu uchovávať niektoré údaje spoločné pre celý program. Na definovanie globálnych premenných použite globálne kľúčové slovo:1

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

Po zavolaní funkcie getGlobal() je možné k premennej $gvar pristupovať z ktorejkoľvek časti programu.

Variabilný rozsah je kontext, v ktorom je táto premenná definovaná. Väčšina premenných PHP má jeden rozsah. Tento jediný rozsah (nazývaný aj globálny rozsah) zahŕňa aj zahrnuté súbory:

V tomto príklade bude premenná $a dostupná aj v priloženom skripte - main.inc .

Lokálne premenné

Definícia vlastnej funkcie špecifikuje miestny rozsah pre premennú, t.j. Akákoľvek premenná použitá vo funkcii je štandardne obmedzená na lokálny rozsah funkcie (dostupná len v rámci funkcie, v ktorej je definovaná). Ako to funguje: Na oddelenie premenných používaných vo všeobecnom kóde od premenných používaných vo funkciách poskytuje PHP samostatné úložisko pre premenné v rámci každej funkcie. Toto rozdelenie úložného priestoru znamená, že rozsah, teda oblasť, v ktorej je dostupná hodnota premennej, je lokálnym úložiskom funkcie.

Príklad nižšie jasne ukazuje, že premenná deklarovaná mimo funkcie sa vo vnútri funkcie nemení. Aj keď by ste sa nemali snažiť pochopiť, ako funkcia funguje, hlavnou vecou je, že má svoju vlastnú jedinečnú sadu premenných:

30 ?>

V dôsledku vykonania tohto fragmentu sa zobrazí nasledovné: 30.

Vo funkcii narodenia() je premenná $vek nastavená na 1, ale nie je to tá istá premenná, ktorá bola definovaná v globálnom rozsahu. Preto, keď sa vytlačí hodnota premennej $vek, vytlačí sa pôvodná hodnota 30. Stojí za zmienku, že lokálne premenné sa vytvárajú v čase volania funkcie a po skončení funkcie sa vymažú.

Ak skutočne chcete čítať alebo meniť hodnotu globálnej premennej (ako sa nazývajú premenné používané v globálnom rozsahu) a nie lokálnej v rámci funkcie narodenia(), musí byť v rámci definície funkcie deklarovaná ako globálna.

Poznámka: Aktivuje sa adaptívna verzia stránky, ktorá sa automaticky prispôsobí malej veľkosti vášho prehliadača a skryje niektoré detaily stránky pre ľahšie čítanie. Príjemné sledovanie!

Dobrý deň, milí čitatelia blogu stránky na! V roku sme sa dozvedeli, že v PHP existuje funkcia, naučili sme sa vytvárať vlastné funkcie, odovzdávať im argumenty a volať ich na vykonanie. V pokračovaní témy funkcií v PHP je potrebné zdôrazniť nasledovné veci:

  • Vo vnútri funkcie môžete použiť ľubovoľný PHP kód (cykly, podmienky, ľubovoľné operácie), vrátane ďalších funkcií (vstavaných aj vlastných);
  • Názov funkcie musí začínať latinským písmenom alebo podčiarkovníkom, za ktorým nasleduje ľubovoľný počet latinských písmen, číslic alebo podčiarkovníkov;
  • Všetky funkcie majú globálny rozsah, čo znamená, že akákoľvek funkcia môže byť volaná kdekoľvek, aj keď je táto funkcia definovaná v inej;
  • PHP nepodporuje preťažovanie funkcií, neexistuje ani možnosť predefinovať (zmeniť, pridať) alebo vymazať vytvorenú funkciu;
  • Funkcie nemusia byť pred použitím definované. To znamená, že ak najprv zavoláte funkciu a až potom ju opíšete v kóde nižšie, neovplyvní to výkon a nespôsobí chyby.

Podmienené funkcie

Môžeme vytvoriť (definovať, popísať) funkciu v závislosti od podmienky. Napríklad:

//volaná funkcia sayHi, dá sa volať kdekoľvek /*funkciu sayGoodbye tu nemožno zavolať, pretože sme ešte neskontrolovali podmienku a nevstúpili do konštrukcie if*/ if($apply)( function sayGoodbye())( echo "Ahoj všetci!
"; } } /*teraz môžeme zavolať povedať Goodbye*/
"; }

výsledok:

A pozrite sa na tento príklad:

/*a toto sa stane, ak tu zavoláte rozlúčiť sa*/ povedz ahoj(); if($apply)( function sayGoodbye())( echo "Ahoj všetci!
"; ) ) funkcia sayHi())( echo "Ahojte všetci!
"; }

výsledok:

V skutočnosti, aj keď som pracoval, nikdy som nič podobné nikde nevidel, ale musíte mať na pamäti všetky možnosti jazyka.

Vnorené funkcie

Vnorená funkcia je funkcia deklarovaná v inej funkcii. Príklad:

/*Tu nemôžete zavolať sayGoodbye, pretože sa zobrazí až po zavolaní funkcie sayHi*/ povedz ahoj(); /*zavolajte funkciu sayHi, dá sa volať kdekoľvek*/ /*Teraz môžeme zavolať povedať Goodbye*/ povedz ahoj(); function sayHi())( echo „Ahoj všetci!
"; funkcia sayGoodbye())( echo "Ahoj všetci!
"; } }

Pri prvom prechode sa interpret PHP opäť označí, že našiel popis funkcie sayHi, ale nevstúpi do jeho tela, vidí iba názov, a keďže interpret neprechádza do tela funkcie sayHi, potom netuší, čo definujeme v rámci inej funkcie – sayGoodbye.

Potom sa kód začne vykonávať, zavoláme sayHi, PHP interpret musí prejsť do tela funkcie sayHi, aby ju vykonal, a tam náhodou nájde popis ďalšej funkcie - sayGoodbye, po ktorej sa dá sayGoodbye zavolať kdekoľvek, ako už mnohokrát ako chcete.

Ale stojí za to venovať pozornosť veľmi jemnému bodu vo vyššie uvedenej situácii: funkcia sayHi sa stáva jednorazovou, pretože ak ju zavoláme znova, PHP opäť narazí na definíciu funkcie sayGoodbye a v PHP nemôžete urobiť toto - nemôžete prepísať funkcie. O tom a ako sa s tým vysporiadať som písal v predchádzajúcom článku.

V PHP sa vyššie opísané techniky používajú veľmi zriedka, častejšie ich možno vidieť napríklad v JavaScripte.

Variabilný rozsah

V PHP sú presne dva rozsahy: globálne A miestne. Štruktúra každého programovacieho jazyka je odlišná. Napríklad v C++ majú párne cykly svoj vlastný (lokálny) rozsah. V PHP je to mimochodom globálny rozsah. Dnes však hovoríme o funkciách.

Funkcie v PHP majú svoj vlastný vnútorný rozsah (lokálny), to znamená, že všetky premenné vo funkcii sú viditeľné iba v rámci tejto funkcie.

Takže ešte raz: všetko mimo funkcií je globálny rozsah, všetko vo vnútri funkcií je lokálny rozsah. Príklad:

Vážení odborníci, pozor, otázka! Aký bude výstup poslednej inštrukcie? echo $meno; ?

Ako ste sami videli, mali sme 2 premenné $name, jeden vo vnútri funkcie (lokálny rozsah), druhý len v kóde (globálny rozsah), posledné priradenie k premennej $name bol $name = "Rud Sergey"; Ale keďže to bolo vo vnútri funkcie, zostalo to tam. V globálnom rozsahu bolo posledné zadanie $name = "Andrey";čo je to, čo v skutočnosti vidíme ako výsledok.

Teda dve rovnaké premenné, ktoré sa však v rôznych rozsahoch neprelínajú a neovplyvňujú.

Dovoľte mi ilustrovať rozsah na obrázku:

Počas prvého prechodu tlmočník krátko naskenuje globálny rozsah, zapamätá si, aké premenné a funkcie existujú, ale nevykoná kód.

Prístup ku globálnym premenným z lokálneho rozsahu

Čo ak však stále potrebujeme pristupovať k tej istej premennej $name z globálneho rozsahu z funkcie a nielen k nej pristupovať, ale ju aj zmeniť? Na to existujú 3 hlavné možnosti. Prvým je použitie kľúčového slova globálne:

"; globálne $name; /*odteraz máme na mysli globálnu premennú $name*/$name = "Rud Sergey"; ) $meno = "Andrey"; sayHi($meno); echo $meno; // ?

výsledok:

Táto metóda má však nevýhodu, pretože sme pristupovali ku globálnej premennej $name stratili sme (prepísali) lokálnu premennú $name.

Druhý spôsob je použiť PHP superglobálne pole. PHP samo automaticky umiestni každú premennú, ktorú sme vytvorili v globálnom rozsahu, do tohto poľa. Príklad:

$name = "Andrey"; //Rovnaké ako$GLOBALS["name"] = "Andrey";

Preto:

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

Výsledok je rovnaký ako pri použití kľúčového slova globálne:

Len tentoraz sme neprepísali lokálnu premennú, teda premennú $name vnútri funkcia zostáva rovnaká a je rovnaká "Andrey", ale nie "Rud Sergey".

Odovzdávanie argumentov odkazom

Tretia cesta– ide o prenos adresy ( odkazy) premennej, nie jej hodnoty. Odkazy v PHP nie sú na rozdiel od iných programovacích jazykov príliš úspešné. Poviem vám však jedinú správnu možnosť odovzdania argumentu odkazom na funkciu, ktorá je normálne podporovaná v PHP 5.3 a vyššie. Existujú aj iné spôsoby, ako pracovať s odkazmi, ale fungovali v PHP 5.2 a nižších, v dôsledku čoho sa samotní vývojári PHP rozhodli ich opustiť, takže o nich nebudeme hovoriť.

Takže SPRÁVNE odovzdanie argumentu odkazom v PHP 5.3 a vyššom sa robí takto:

Funkcia sayHi(& $name)(

V samotnom popise funkcie sme pridali ikonu ampersand (&) - táto ikona znamená, že neakceptujeme hodnotu premennej, ale odkaz (adresu) na túto hodnotu v pamäti. Referencie v PHP vám umožňujú vytvoriť dve premenné ukazujúce na rovnakú hodnotu. To znamená, že keď sa zmení jedna z týchto premenných, obe sa zmenia, pretože odkazujú na rovnakú hodnotu v pamäti.

A na záver tu máme:

//akceptovať nie hodnotu, ale odkaz na hodnotu echo "Dobrý deň, ".$name."!
"; $name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

výsledok:

Statické premenné

Predstavte si nasledujúcu situáciu: musíme spočítať, koľkokrát sme sa celkovo pozdravili. Tu je to, o čo sa snažíme:

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


výsledok:

Variabilné $c nepamätá si svoj význam, zakaždým sa vytvára nanovo. Musíme vytvoriť našu lokálnu premennú $c zapamätali si svoju hodnotu po vykonaní funkcie, na to používajú kľúčové slovo statické:

// počítadlo, urobené staticky echo "Dobrý deň, ".$name."!
"; $c++; // zvýšenie počítadla o 1 echo "Práve som povedal ahoj". $c . "raz.


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

výsledok:

Vracia sa hodnoty

Funkcie majú takú pohodlnú vec, ako je vracanie hodnôt. To je, keď funkcia namiesto toho, aby niečo vytlačila na obrazovku, vloží všetko do premennej a túto premennú nám poskytne. A už sa rozhodujeme, čo s tým. Vezmime si napríklad túto funkciu, odmocní číslo:

výsledok:

Urobme to tak, že namiesto zobrazenia na obrazovke vráti výsledok vykonania. Ak to chcete urobiť, použite kľúčové slovo return:

výsledok:

Teraz to môžeme použiť rôznymi spôsobmi:

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

výsledok:

Upozorňujeme, že kľúčové slovo vrátiť nevráti len hodnotu, ale úplne preruší funkciu, teda celý kód, ktorý je pod kľúčovým slovom vrátiť sa nikdy nesplní. Inými slovami, návrat pre funkcie tiež funguje ako prestávka pre slučky:

echo "PHP sa ku mne nikdy nedostane :(";) echo getSquare(5); //vypíše výsledok ozvena"
$num = getSquare(5); // priradil výsledok do premennej echo $num; // zobrazenie premennej na obrazovke

výsledok:

Teda vrátiť– toto je tiež výstup z funkcie. Môže sa použiť bez návratovej hodnoty, len kvôli výstupu.

Rekurzívna funkcia

Rekurzívna funkcia je funkcia, ktorá volá sama seba. Rekurzia sa nepoužíva často a považuje sa za operáciu náročnú na zdroje (pomalú). Stáva sa však, že použitie rekurzie je najzrejmejšou a najjednoduchšou možnosťou. Príklad:

"; if($číslo< 20){ // aby sa rekurzia nestala nekonečnou pocetProsim(++$cislo); // sa zavolala funkcia countPlease) ) countPlease(1);

výsledok:

Ak viete, ako to urobiť bez rekurzie, potom je lepšie to urobiť.

Silné písanie v PHP (zjemnenie typu)

PHP robí malé kroky smerom k silnému typovaniu, takže môžeme vopred špecifikovať, aký typ má mať funkcia (tzv tip-nápoveda):

výsledok:

Zachytiteľná fatálna chyba: Argument 1 odovzdaný do countPlease() musí byť pole, dané celé číslo, volané v /home/index.php v riadku 7 a definované v /home/index.php v riadku 3

Chyba nám hovorí, že funkcia očakáva prijatie poľa, ale namiesto toho jej odovzdávame číslo. Bohužiaľ, zatiaľ môžeme zadať iba typ pre (pole) a s PHP 5.4 sme pridali aj takú možnosť ako volateľný:

Volateľné skontroluje, či možno odovzdanú hodnotu zavolať ako funkciu. Volateľný môže byť buď názov funkcie špecifikovanej reťazcovou premennou, alebo objekt a názov volanej metódy. O objektoch a metódach si však povieme neskôr (toto je časť objektovo orientovaného programovania), ale funkcie už poznáte. Nemôžem vám ukázať výsledok práce, keďže momentálne mám PHP 5.3, ale bolo by to:

Volá sa funkcia getEcho

Použitie argumentov s premenlivou dĺžkou

A na záver ešte jedna veľmi zriedka používaná nuansa. Predstavte si situáciu: funkcii odovzdávame argumenty, hoci sme ich vo funkcii nepopísali, napríklad:

výsledok:

Ako vidíte, neexistujú žiadne chyby, ale naše odovzdané argumenty sa nikde nepoužívajú. To však neznamená, že sú preč - stále boli odovzdané do funkcie a môžeme ich použiť; existujú na to vstavané funkcie PHP:

func_num_args()- Vráti počet argumentov odovzdaných funkcii
func_get_arg(poradové číslo)- Vráti prvok zo zoznamu argumentov
func_get_args()- Vráti pole obsahujúce argumenty funkcie

"; echo func_get_arg(0) ; ) $vek = 22; getEcho("Rud Sergey", $vek);

výsledok:

Záver

Dnešný článok je posledným na tému funkcií v PHP. Teraz si môžete byť istí úplnosťou svojich vedomostí o tejto téme a môžete s istotou používať funkcie pre svoje potreby.

Ak má niekto chuť sa v tom zdokonaliť, ale netuší, ako na to, najlepším spôsobom by bolo napísať hotové (zabudované) funkcie PHP, napríklad si môžete napísať vlastnú funkciu count() alebo akékoľvek iné.

Ďakujem vám všetkým za pozornosť a uvidíme sa znova! Ak vám niečo nie je jasné, neváhajte sa opýtať v komentároch!

Rozsah premennej je kontext, v ktorom je premenná definovaná. Vo väčšine prípadov majú všetky premenné PHP iba ​​jeden rozsah. Tento jediný rozsah zahŕňa aj zahrnuté a požadované súbory. Napríklad:

$a = 1;
zahŕňajú "b.inc" ;
?>

Tu bude premenná $a dostupná v rámci zahrnutého skriptu b.inc. Definícia (telo) užívateľom definovanej funkcie však špecifikuje lokálny rozsah tejto funkcie. Akákoľvek premenná použitá v rámci funkcie je štandardne obmedzená na lokálny rozsah funkcie. Napríklad:

$a = 1; /* globálny rozsah */

Funkčný test ()
{
echo $a ; /* odkaz na premennú lokálneho rozsahu */
}

Test();
?>

Tento skript nevygeneruje žiadny výstup, pretože príkaz echo ukazuje na lokálnu verziu premennej $a a v rámci tohto rozsahu jej nebola priradená hodnota. Možno ste si všimli, že je to trochu odlišné od C v tom, že globálne premenné v C sú automaticky dostupné pre funkcie, pokiaľ neboli prepísané lokálnou definíciou. To môže spôsobiť určité problémy, pretože ľudia môžu náhodne zmeniť globálnu premennú. Ak sa má v PHP použiť globálna premenná v rámci funkcie, musí byť v rámci definície funkcie deklarovaná ako globálna.

Kľúčové slovo globálne

Najprv príklad použitia globálne:

Príklad #1 Použitie globálne

$a = 1;
$b = 2;

funkcia Suma()
{
globálne $a, $b;

$b = $a + $b ;
}

Suma();
echo $b ;
?>

Vyššie uvedený skript sa zobrazí 3 . Keď sú $a a $b definované ako globálne vo funkcii, všetky odkazy na ktorúkoľvek z týchto premenných budú ukazovať na ich globálnu verziu. Neexistuje žiadny limit na počet globálnych premenných, ktoré môže funkcia spracovať.

Druhým spôsobom prístupu k premenným globálneho rozsahu je použitie špeciálneho poľa definovaného PHP, $GLOBALS . Predchádzajúci príklad by sa dal prepísať takto:

$GLOBALS je asociatívne pole, ktorého kľúčom je názov a hodnota je obsahom globálnej premennej. Všimnite si, že $GLOBALS existuje v akomkoľvek rozsahu, pretože $GLOBALS je superglobálny. Nižšie je uvedený príklad demonštrujúci schopnosti superglobálov:

Príklad č. 3 Superglobály a rozsah

funkcia test_global()
{
// Väčšina preddefinovaných premenných nie je
// "super" a bude k dispozícii v miestnej oblasti
// viditeľnosť, funkcie vyžadujú zadanie "global".
globálne $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS["meno"];

// Superglobálni sú k dispozícii v akomkoľvek rozsahu
// viditeľnosť a nevyžadujú zadanie "global".
// Superglobals sú dostupné od PHP 4.1.0 a
// používanie HTTP_POST_VARS je zastarané.
echo $_POST ["meno" ];
}
?>

Komentujte:

Používanie kľúčových slov globálne mimo funkcie nie je chyba. Dá sa použiť v súbore, ktorý je súčasťou funkcie.

Použitie statického ( statické) premenné

Ďalšou dôležitou vlastnosťou variabilného rozsahu je statické premenlivý. Statická premenná existuje iba v lokálnom rozsahu funkcie, ale nestráca svoju hodnotu, keď vykonávanie programu opustí tento rozsah. Zvážte nasledujúci príklad:

Príklad č. 4 Preukázanie potreby statických premenných

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

Táto funkcia je dosť zbytočná, pretože zakaždým, keď je zavolaná, nastaví $a na 0 a výstupy 0 . Prírastok premennej $a ++ tu nehrá žiadnu rolu, keďže premenná $a pri ukončení funkcie zmizne. Ak chcete napísať užitočnú funkciu počítania, ktorá nestráca aktuálnu hodnotu počítadla, premenná $a sa deklaruje ako statická:

Príklad č. 5 Príklad použitia statických premenných

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

Teraz bude $a inicializované iba pri prvom volaní funkcie a pri každom volaní funkcie test() vytlačí hodnotu $a a zvýši ju.

Statické premenné umožňujú pracovať aj s rekurzívnymi funkciami. Rekurzívna funkcia je taká, ktorá volá sama seba. Pri písaní rekurzívnej funkcie musíte byť opatrní, pretože existuje možnosť, že rekurzia bude nekonečná. Musíte zabezpečiť, aby existoval primeraný spôsob ukončenia rekurzie. Nasledujúca jednoduchá funkcia počíta rekurzívne až do 10, pričom na určenie, kedy sa má zastaviť, používa statická premenná $count:

Komentujte:

Statické premenné možno deklarovať tak, ako je uvedené v predchádzajúcom príklade. Pokus o priradenie hodnôt týmto premenným, ktoré sú výsledkom výrazov, spôsobí chybu spracovania.

Príklad č. 7 Deklarovanie statických premenných

funkcia foo ()(
static $int = 0 ; // správny
static $int = 1 + 2 ; // nesprávne (keďže je to výraz)
statický $int = sqrt(121); // nesprávne (keďže toto je tiež výraz)

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

Komentujte:

Statické deklarácie sa vyhodnocujú počas kompilácie skriptu.

Prepojenia s globálnymi ( globálne) a statické ( statické) premenné

Zend Engine 1, ktorý poháňa PHP 4, považuje modifikátory statických a globálnych premenných za referencie. Napríklad skutočná globálna premenná vložená do rozsahu funkcie zadaním kľúčového slova globálne, v skutočnosti vytvára odkaz na globálnu premennú. Môže to viesť k neočakávanému správaniu, ako ukazuje nasledujúci príklad:

test funkcie test_global_ref() (
globálne $obj ;
$obj = &new stdclass ;
}

test funkcie test_global_noref() (
globálne $obj ;
$obj = new stdclass ;
}

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

Výsledok spustenia tohto príkladu: get_instance_noref () (
statický $obj ;

Echo "Statický objekt: ";
var_dump($obj);
if (!isset($obj )) (
// Priradenie objektu k statickej premennej
$obj = new stdclass ;
}
$obj -> property++;
návrat $obj ;
}

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

Výsledok spustenia tohto príkladu:

Statický objekt: NULL
Statický objekt: NULL

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

Tento príklad ukazuje, že keď priradíte odkaz na statickú premennú, nepriradí sa zapamätateľné keď zavoláte funkciu &get_instance_ref() druhýkrát.

Na vytvorenie plnohodnotného webu so širokým spektrom funkcií potrebujete vedieť veľa. PHP však môže dať stránke skutočnú jedinečnosť. Globálna premenná sa v tomto programovacom jazyku často nepoužíva, no niekedy je veľmi užitočné vedieť, ako funguje.


V tomto článku budeme študovať, čo presne je globálna premenná a ako funguje.

Globálna premenná: rozsah

Kontext, v ktorom je premenná definovaná, sa nazýva jej rozsah. Premenné majú zvyčajne iba jeden rozsah. Keď sú globálne premenné v PHP načítané z iných súborov, môžu byť vyžadované alebo zahrnuté. Štandardne sú obmedzené na lokálny rozsah funkcie. Ako môžete premennú zviditeľniť pre súbory za jej hranicami a zároveň ju môcť používať? To je presne dôvod, prečo PHP poskytuje globálnu premennú. Kľúčové slovo je tu „globálne“. Ako deklarovať globálnu premennú v PHP? Na dosiahnutie tohto cieľa je potrebné použiť slovo „globálny“. Musí byť umiestnený bezprostredne pred premennou, ktorú chcete zmeniť na globálnu. Vyzerá to asi takto: globálna „premenná“. Po implementácii pokynov tohto druhu bude môcť s údajmi pracovať úplne každý súbor.

Ak sú niekde odkazy na túto premennú, program bude venovať pozornosť globálnej verzii. Prečo sa používa taká zvláštna formulácia? Ide o to, že súčasne môžu existovať aj lokálne verzie. Budú však prístupnejšie výlučne v súboroch, v ktorých sú deklarované. Na zvyšok sa použijú globálne premenné triedy PHP. Tu musíte konať veľmi opatrne a opatrne. Aby sme predišli akýmkoľvek pochybnostiam, uveďme jednoduchý príklad, ako by mohli vyzerať: globálne a. Ak má jeden súbor prístup k viacerým premenným, môže to spôsobiť konflikt. Tu však nie je možné s istotou povedať, či sa bude čítať globálna alebo lokálna premenná, alebo či sa vyskytne chyba. Ak to napíšete do funkcie, nemali by nastať žiadne problémy. Použitie premennej mimo hraníc funkcie bude problematické. Preto musíte veľmi pozorne sledovať štruktúru kódu a uistiť sa, že nikde nie sú žiadne predpoklady pre konflikt.

Globálne premenné: Iný zápis
Existujú iné spôsoby, ako nastaviť globálne premenné? Áno, a nie sám. Najprv sa pozrime na $GLOBALS. Ide o asociatívne pole, v ktorom je kľúčom meno. Ako hodnota sa použije obsah globálnej premennej. Stojí za zmienku, že po deklarácii toto pole existuje v akomkoľvek rozsahu. To dáva dôvod považovať ho za superglobálny. Vyzerá to takto: $GLOBALS ['Premenná'].

Superglobáli
V každom programovacom jazyku existujú názvy, ktoré sú vyhradené pre jednotlivé funkcie. V PHP jednoducho nie je možné vytvárať globálne premenné s rovnakým názvom. Tento programovací jazyk má svoje vlastné charakteristiky. Napríklad je obzvlášť dôležité, aby preddefinované premenné nemali predponu „super“. To znamená, že nie sú dostupné vo všetkých lokalitách. Ako sa dá táto situácia napraviť? Ak chcete sprístupniť preddefinovanú premennú v nejakej lokálnej sieti, musíte ju deklarovať takto: globálna „premenná“. Toto už bolo spomenuté skôr. Nie je to však celkom pravda. Pozrime sa na skutočný príklad:
globálne $HTTP_POST_VARS; echo $HTTP_POST_VARS ['meno'].
Cítiš ten rozdiel? Stojí za to mať na pamäti, že v PHP musí byť vo funkcii použitá globálna premenná. Môže sa nachádzať aj v súbore, ktorý je v ňom zahrnutý.

Zabezpečenie a odkazy
Ako sami vidíte, vytvorenie globálnej premennej v PHP nie je problém. Existujú však nejaké špecifiká týkajúce sa odkazov? Pri použití globálnych premenných je možné neočakávané správanie. Pred podrobnejším štúdiom tejto problematiky je však potrebné obrátiť sa na pozadie. Direktíva register_globals bola vo verzii 4.2 štandardne zmenená z povolenej na vypnutú. Pre mnohých používateľov je to úplne nedôležité a márne, pretože od toho priamo závisí bezpečnosť vyvíjaného produktu. Ak potrebujete vytvoriť globálnu premennú, direktíva PHP toto nastavenie priamo neovplyvní. Nesprávne použitie sa však môže stať bezpečnostným rizikom. Napríklad, ak je register_globals v povolenom stave, potom sa pred spustením kódu inicializujú rôzne potrebné premenné. Preto sa ho rozhodli vypnúť. Prečo globálna premenná vďačí za veľkú časť svojho stavu danej smernici? Problém je v tom, že keď bol povolený, vývojári neboli vždy schopní odpovedať na otázku, odkiaľ pochádza, no na druhej strane to značne uľahčilo proces písania kódu. Takáto organizácia zároveň vytvárala určitú hrozbu pre bezpečnosť. Smernica bola deaktivovaná, aby sa predišlo miešaniu údajov a chybám. Teraz sa pozrime na príklad nebezpečného kódu. Pozrieme sa tiež na to, ako môžete odhaliť prípady, keď deklaráciu globálnej premennej PHP sprevádza pokus o nahradenie informácie. Je to potrebné na vytvorenie stabilných pracovných stránok, ktoré nemôže hacknúť prvý používateľ, ktorý na ne narazí.

Nebezpečné kódy
Nastavme premennú na hodnotu true pre tých používateľov, ktorí sú autorizovaní:
If (authenticate_user()) ($authoriza=true;) if ($authorize) (zahrňte „/vysoko/citlivé/data.php“;). Premenná v tomto stave môže byť nastavená automaticky. Ak vezmeme do úvahy, že údaje sa dajú jednoducho nahradiť a zdroj ich pôvodu nie je stanovený, môže takouto kontrolou prejsť prakticky každý používateľ a vydávať sa za kohokoľvek. Útočník, ak je to žiaduce, môže narušiť logiku celého skriptu. Ak zmeníte hodnotu smernice, kód bude fungovať správne. To je presne to, čo musíme urobiť. Inicializácia premenných však nie je len dobrou praxou medzi programátormi, ale zaručuje aj stabilitu skriptu.

Spoľahlivá možnosť
Na dosiahnutie tohto cieľa sa môžete pokúsiť zakázať smernicu alebo napísať zložitejší kód, napríklad takto: if (isset($_SESSION ['používateľské meno'])) (echo „Ahoj“ ($_SESSION ['používateľské meno' ])“;) else (echo „Ahoj hosť“; echo „Vitajte!“;). V tomto prípade bude ťažké vykonať náhradu. Je to však možné. Aby ste to dosiahli, musíte sa vopred postarať o dostupnosť nástrojov rýchlej reakcie. Ak potrebujete do PHP zahrnúť globálne premenné, môžete použiť nasledujúci nástroj: ak presne viete, v akom rozsahu bude hodnota prijatá, môžete to zapísať tak, že skript porovnávaním overí túto skutočnosť. To, samozrejme, tiež nemôže zaručiť 100% ochranu proti zámene hodnoty. Prechod možnými možnosťami však výrazne skomplikuje operáciu.

Ako zistiť pokus o spoofing?
Teraz sa pozrime, či ste správne pochopili všetko, čo bolo predtým napísané. Globálne premenné vo funkcii budete musieť deklarovať sami. Toto je druh domácej úlohy. Najprv tu je kód:

Uveďme niekoľko vysvetlení. Premenná C_COOKIE je prevzatá zo spoľahlivého zdroja. Aby sa zabezpečilo, že výsledok bude podľa očakávania, skontroluje sa hodnota premennej. Ak sa vyskytnú problémy, administrátor dostane upozornenie. Ak sa nič nestane, nepodniknú sa žiadne opatrenia.