Php7 - PHP: globálne vo funkcii nezobrazuje premennú - Stack Overflow v ruštine. Rozsah premenných PHP. Všetko, čo ste chceli vedieť, ale báli ste sa opýtať Vytlačte globálnu premennú php mimo funkcie

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é pristupovať k premennej $gvar z ktorejkoľvek časti programu.

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 bežne podporovaná v PHP 5.3 a vyššom. 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ýšiť počítadlo 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ýšiť počítadlo 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é) PHP funkcie, 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!

Tento tutoriál pokrýva rozsah premenných PHP. Vysvetľuje rozdiel medzi lokálnym a globálnym rozsahom, ukazuje, ako pristupovať ku globálnym premenným v rámci funkcie, ako pracovať so superglobálmi a vytvárať statické premenné.

Keď sa začnete učiť PHP a začnete pracovať s funkciami a objektmi, variabilný rozsah je trochu mätúci. Našťastie sú pravidlá PHP v tomto smere veľmi ľahko pochopiteľné (v porovnaní s inými programovacími jazykmi).

Čo je rozsah?

Rozsah premenných je kontext, v rámci ktorého bola premenná definovaná a kde k nej možno pristupovať. PHP má dva variabilné rozsahy:

  • globálne- premenné sú prístupné kdekoľvek v skripte
  • Miestne- premenné sú prístupné iba vo funkcii, v ktorej boli definované

Rozsah premennej, a najmä lokálnej, výrazne zjednodušuje správu kódu. Ak by boli všetky premenné globálne, potom by sa dali zmeniť kdekoľvek v skripte. To by viedlo k chaosu a veľkým skriptom, pretože veľmi často rôzne časti skriptu používajú premenné s rovnakými názvami. Obmedzením rozsahu na lokálny kontext definujete hranice kódu, ktorý môže pristupovať k premennej, vďaka čomu je kód robustnejší, modulárny a ľahšie sa ladí.

Premenné s globálnym rozsahom sa nazývajú globálne a premenné s lokálnym rozsahom sa nazývajú lokálne.

Tu je príklad toho, ako fungujú globálne a lokálne premenné.

"; ) sayHello(); echo "Hodnota \$globalName: "$globalName"
"; echo "\$localName hodnota: "$localName"
"; ?>

Ahoj Harry! $globalName value: "Zoe" $localName value: ""

V tomto skripte sme vytvorili dve premenné:

  • $globalName- Toto globálne premenlivý
  • $localName- Toto miestne premenná, ktorá je vytvorená vo funkcii sayHello().

Po vytvorení premennej a funkcie skript zavolá sayHello(), čo vypíše "Ahoj Harry!" . Skript sa potom pokúsi vypísať hodnoty dvoch premenných pomocou funkcie echo. Čo sa stane:

  • Pretože $globalName bol vytvorený mimo funkcie, je dostupný kdekoľvek v skripte, takže výstupom je „Zoe“.
  • $localName bude k dispozícii iba vo funkcii sayHello(). Keďže výraz echo je mimo funkcie, PHP neposkytuje prístup k lokálnej premennej. Namiesto toho PHP očakáva, že kód vytvorí novú premennú s názvom $localName , ktorá bude mať predvolenú hodnotu prázdneho reťazca. preto druhé volanie echo vypíše hodnotu "" pre premennú $localName.

Prístup ku globálnym premenným vnútri funkcie

Prístup ku globálnej premennej mimo funkcie Stačí napísať jej meno. Ale na prístup ku globálnej premennej vnútri funkcie, najprv musíte premennú deklarovať ako globálnu vo funkcii pomocou kľúčového slova global:

Funkcia myFunction() (globálna $globalVariable; // Prístup ku globálnej premennej $globalVariable)

Ak to neurobíte, PHP predpokladá, že vytvárate alebo používate lokálnu premennú.

Tu je príklad skriptu, ktorý používa globálnu premennú vo funkcii:

"; globálne $globalName; echo "Dobrý deň, $globalName!
"; ) povedz Ahoj(); ?>

Po spustení skript vypíše:

Ahoj Harry! Ahoj Zoya!

Funkcia sayHello() používa globálne kľúčové slovo na vyhlásenie premennej $globalName za globálnu. Potom môže získať prístup k premennej a vydať jej hodnotu („Zoe“).

Čo sú to superglobáli?

PHP má špeciálnu sadu preddefinovaných globálnych polí, ktoré obsahujú rôzne informácie. Takéto polia sa nazývajú superglobáli, pretože sú prístupné odkiaľkoľvek v skripte, vrátane interného funkčného priestoru, a nemusia byť definované pomocou globálneho kľúčového slova.

Tu je zoznam superglobálov dostupných vo verzii PHP 5.3:

  • $GLOBALS - zoznam všetkých globálnych premenných v skripte (okrem superglobálov)
  • $_GET – obsahuje zoznam všetkých polí formulára odoslaných prehliadačom pomocou požiadavky GET
  • $_POST – obsahuje zoznam všetkých polí formulára odoslaných prehliadačom pomocou požiadavky POST
  • $_COOKIE – obsahuje zoznam všetkých cookies odoslaných prehliadačom
  • $_REQUEST – obsahuje všetky kombinácie kľúč/hodnota, ktoré sú obsiahnuté v poliach $_GET, $_POST, $_COOKIE
  • $_FILES - obsahuje zoznam všetkých súborov stiahnutých prehliadačom
  • $_SESSION - umožňuje ukladať a používať premenné relácie pre aktuálny prehliadač
  • $_SERVER – obsahuje informácie o serveri, ako je názov súboru spúšťaného skriptu a IP adresa prehliadača.
  • $_ENV – obsahuje zoznam premenných prostredia odovzdaných do PHP, ako sú premenné CGI.
Môžete napríklad použiť $_GET na získanie hodnôt premenných uzavretých v reťazci adresy URL požiadavky skriptu a ich zobrazenie na stránke:

Ak spustíte skript uvedený vyššie pomocou adresy URL http://www.example.com/script.php?vaseName=Fred, vypíše sa:

Ahoj Fred!

POZOR! V skutočnom skripte by sa takýto prenos údajov nikdy nemal používať z dôvodu slabého zabezpečenia. Údaje by ste mali vždy overiť alebo filtrovať.

Superglobal $GLOBALS sa používa veľmi pohodlne, pretože vám umožňuje organizovať prístup ku globálnym premenným vo funkcii bez potreby globálneho kľúčového slova. Napríklad:

"; ) sayHello(); // Vypíše "Ahoj, Zoya!" ?>

Statické premenné: niekde sa nachádzajú

Keď vo funkcii vytvoríte lokálnu premennú, existuje iba vtedy, keď je funkcia spustená. Po dokončení funkcie lokálna premenná zmizne. Pri opätovnom volaní funkcie sa vytvorí nová lokálna premenná.

Vo väčšine prípadov to funguje skvele. Funkcie sú teda samostatné a pri každom vyvolaní fungujú vždy rovnako.

Sú však situácie, kedy by bolo vhodné vytvoriť lokálnu premennú, ktorá si medzi volaniami funkcií „pamätá“ svoju hodnotu. Takáto premenná sa nazýva statická.

Ak chcete vytvoriť statickú premennú vo funkcii, musíte použiť kľúčové slovo static pred názvom premennej a nezabudnite mu dať počiatočnú hodnotu. Napríklad:

Funkcia myFunction() ( static $myVariable = 0; )

Uvažujme o situácii, kedy je vhodné použiť statickú premennú. Povedzme, že vytvoríte funkciu, ktorá po zavolaní vytvorí miniaplikáciu a zobrazí počet už vytvorených miniaplikácií. Môžete skúsiť napísať kód takto pomocou lokálnej premennej:


"; echo createWidget() ." sme už vytvorili.
"; echo createWidget() ." sme už vytvorili.>
"; ?>

Ale keďže sa premenná $numWidgets vytvorí pri každom volaní funkcie, dostaneme nasledujúci výsledok:

Vytvárame nejaké widgety... Už sme vytvorili 1. Vytvorili sme už 1. Vytvorili sme už 1.

Ale pomocou statickej premennej môžeme uložiť hodnotu z jedného volania funkcie do druhého:

"; echo createWidget() ." sme už vytvorili.
"; echo createWidget() ." sme už vytvorili.
"; echo createWidget() ." >už sme vytvorili.
"; ?>

Teraz skript vytvorí očakávaný výsledok:

Vytvárame nejaké widgety... Už sme vytvorili 1. Vytvorili sme už 2. Vytvorili sme už 3.

Hoci si statická premenná zachováva svoju hodnotu medzi volaniami funkcií, je platná iba počas spustenia skriptu. Po dokončení vykonávania skriptu sa zničia všetky statické premenné, ako aj lokálne a globálne premenné.

To je všetko! Často sa riaďte dokumentáciou PHP.

Tu je potrebné poznamenať, že prvok kódu, ktorý ste predložili, by sa mal považovať za zlý dizajn a štýl programovania, pretože so zahrnutým súborom zaobchádza ako s okamžite spustiteľným súborom operácií.

Najsprávnejším prístupom by bolo vložiť množinu operácií ako funkcie/triedy s vlastným názvom do súboru, zahrnúť súbor (bez akéhokoľvek príkazu return mimo funkcií) a potom zavolať funkciu samozrejme s požadovaným súborom argumentov.

V čom je teda problém?

Všetko je veľmi jednoduché, urobíte to zahŕňajú vnútri metódy metóda, čo znamená, že premenné špecifikované v priloženom súbore sú inicializované v rozsahu metódy metóda. Preto premenná $lang nie je globálny a je obmedzený viditeľnosťou metódy a pristupujete ku globálnej premennej, takže pri použití modifikátora globálne bude sa rovnať nule.

Ak zahrniete do globálneho rozsahu, premenná lang sa stane verejnou (globálnou) a jej použitie bude možné. Dá sa to ľahko skontrolovať, do priloženého súboru, než začnete definovať akúkoľvek premennú, stačí napísať globálna $ premenná.

Príklad:

zahrnúť "file1.php"; function include2() ( include "file2.php"; )
  • súbor1.php je definovaný v globálnom rozsahu.
  • file2.php je definovaný v lokálnom rozsahu funkcie include2.

Prístup s globálnymi premennými a takými patrí je barlička, ktorá vám v budúcnosti prinesie problémy. Funkcie musia byť explicitne definované, musia mať jedinečný názov a musia byť vykonávané na požiadanie.

Prečo je prístup s globálnymi premennými zlý?

Ide o to, že globálne premenné sú viditeľné odkiaľkoľvek, globálne. To je výhodné: neexistujú žiadne obmedzenia. Na druhej strane je úplne nemožné sledovať, kto mení údaje. Nekontrolované zmeny sú prvá vec, ktorá zvyčajne príde na myseľ, keď sa spýtate, prečo sú globálne premenné zlé.

Povedzme, že máte funkciu, ktorej výsledok závisí od globálnej premennej. Zavoláte ju, zavoláte, no po 10 minútach funkcia začne vracať nesprávne výsledky. Čo sa stalo? Koniec koncov, odovzdávate mu rovnakú sadu parametrov ako vstup? Hmm, niekto zmenil hodnotu globálnej premennej... Kto to môže byť? Áno, komukoľvek – globálna premenná je predsa dostupná každému..

Najlepší recept na navrhovanie podprogramov je: aby výsledok vašej funkcie závisel iba od argumentov. Toto je ideál, o ktorý sa treba snažiť.

Vo svojom projekte zbytočne nepoužívajte globálne premenné, využite všetky funkcie lokálneho rozsahu, odovzdávanie parametrov argumentom funkcií a kód sa bude ľahšie písať, udržiavať a testovať.

Viete, aká je najlepšia predpona pre globálne premenné?

Premenné definované v rámci podprogramu (používateľom definovaná funkcia). Sú prístupné iba v rámci funkcie, v ktorej sú definované.

Pre PHP sú všetky premenné deklarované a používané vo funkcii štandardne lokálne pre funkciu. To znamená, že štandardne nie je možné zmeniť hodnotu globálnej premennej v tele funkcie.

Ak v tele užívateľom definovanej funkcie použijete premennú s názvom identickým s názvom globálnej premennej (umiestnenej mimo užívateľom definovanej funkcie), potom táto lokálna premenná nebude mať žiadny vzťah ku globálnej premennej. V tejto situácii sa v užívateľom definovanej funkcii vytvorí lokálna premenná s názvom zhodným s názvom globálnej premennej, ale táto lokálna premenná bude dostupná len v rámci tejto užívateľom definovanej funkcie.

Vysvetlime si túto skutočnosť na konkrétnom príklade:

$a = 100;

function function() (
$a = 70;
ozvena"

$a

" ;
}
funkcia();
ozvena"

$a

" ;
?>

Skript vytlačí najskôr 70 a potom 100:

70
100

Aby ste sa zbavili tohto nedostatku, existuje špeciálna inštrukcia v PHP globálne, čo umožňuje užívateľom definovanej funkcii pracovať s globálnymi premennými. Pozrime sa na tento princíp na konkrétnych príkladoch:

$a = 1;
$b = 2;

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

$b = $a + $b ;
}

Suma();
echo $b ;
?>

Vyššie uvedený skript vypíše " 3 ". Po definovaní $a A $ b vnútri funkcie ako globálne 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ôžu byť spracované užívateľom definovanými funkciami.

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:

Použitie $GLOBALS namiesto globálneho:

$a = 1;
$b = 2;

Funkcia Suma()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}

Suma();
echo $b ;
?>

$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 toto je pole. Nižšie je uvedený príklad demonštrujúci schopnosti superglobálov:

funkcia test_global()
{
// Väčšina preddefinovaných premenných nie je
// "super" a bude k dispozícii v miestnej oblasti
// viditeľnosť funkcie vyžaduje 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 dostupné od PHP 4.1.0
echo $_POST ["meno" ];
}
?>