Php7 - PHP: globální uvnitř funkce nezobrazuje proměnnou - Stack Overflow v ruštině. Rozsah proměnných PHP. Vše, co jste chtěli vědět, ale báli jste se zeptat Vytiskněte globální proměnnou php mimo funkci

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.

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 vyšších. 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ýšit počítadlo 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ýšit počítadlo 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!

Tento tutoriál pokrývá rozsah proměnných PHP. Vysvětluje rozdíl mezi lokálním a globálním rozsahem, ukazuje, jak přistupovat ke globálním proměnným v rámci funkce, jak pracovat se superglobály a vytvářet statické proměnné.

Když se začnete učit PHP a začnete pracovat s funkcemi a objekty, variabilní rozsah je trochu matoucí. Naštěstí jsou pravidla PHP v tomto ohledu velmi snadno pochopitelná (ve srovnání s jinými programovacími jazyky).

Co je rozsah?

Rozsah proměnných je kontext, ve kterém byla proměnná definována a kde k ní lze přistupovat. PHP má dva variabilní rozsahy:

  • Globální- proměnné jsou přístupné kdekoli ve skriptu
  • Místní- proměnné jsou přístupné pouze uvnitř funkce, ve které byly definovány

Rozsah proměnné, a zejména té lokální, značně zjednodušuje správu kódu. Pokud by byly všechny proměnné globální, mohly by být změněny kdekoli ve skriptu. To by vedlo k chaosu a velkým skriptům, protože různé části skriptu velmi často používají proměnné se stejnými názvy. Omezením rozsahu na místní kontext definujete hranice kódu, který může přistupovat k proměnné, díky čemuž je kód robustnější, modulárnější a snáze se ladí.

Proměnné s globálním rozsahem se nazývají globální a proměnné s lokálním rozsahem se nazývají lokální.

Zde je příklad toho, jak fungují globální a lokální proměnné.

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

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

V tomto skriptu jsme vytvořili dvě proměnné:

  • $globalName- Tento globální variabilní
  • $localName- Tento místní proměnná, která je vytvořena uvnitř funkce sayHello().

Po vytvoření proměnné a funkce skript zavolá sayHello(), která vypíše "Ahoj Harry!" . Skript se poté pokusí vypsat hodnoty dvou proměnných pomocí funkce echo. Co se stane:

  • Protože $globalName byl vytvořen mimo funkci, je dostupný kdekoli ve skriptu, takže je na výstupu "Zoe".
  • $localName bude k dispozici pouze ve funkci sayHello(). Protože výraz echo je mimo funkci, PHP neposkytuje přístup k místní proměnné. Místo toho PHP očekává, že kód vytvoří novou proměnnou s názvem $localName , která bude mít výchozí hodnotu prázdného řetězce. proto druhé volání echo vypíše hodnotu "" pro proměnnou $localName.

Přístup ke globálním proměnným uvnitř funkce

Pro přístup ke globální proměnné mimo funkci Stačí napsat její jméno. Ale pro přístup ke globální proměnné uvnitř funkce, musíte nejprve deklarovat proměnnou jako globální ve funkci pomocí klíčového slova global:

Funkce myFunction() ( global $globalVariable; // Přístup ke globální proměnné $globalVariable )

Pokud to neuděláte, PHP předpokládá, že vytváříte nebo používáte lokální proměnnou.

Zde je příklad skriptu, který používá globální proměnnou uvnitř funkce:

"; globální $globalName; echo "Dobrý den, $globalName!
"; ) řekni Ahoj(); ?>

Po spuštění skript vypíše:

Ahoj Harry! Ahoj Zoyo!

Funkce sayHello() používá globální klíčové slovo k prohlášení proměnné $globalName za globální. Poté může přistupovat k proměnné a vydávat její hodnotu („Zoe“).

Co jsou superglobálové?

PHP má speciální sadu předdefinovaných globálních polí, která obsahují různé informace. Taková pole se nazývají superglobálové, protože jsou přístupné odkudkoli ve skriptu, včetně vnitřního prostoru funkcí, a není třeba je definovat pomocí klíčového slova global.

Zde je seznam superglobálů dostupných v PHP verze 5.3:

  • $GLOBALS - seznam všech globálních proměnných ve skriptu (kromě superglobálů)
  • $_GET – obsahuje seznam všech polí formuláře odeslaných prohlížečem pomocí požadavku GET
  • $_POST - obsahuje seznam všech polí formuláře odeslaných prohlížečem pomocí požadavku POST
  • $_COOKIE – obsahuje seznam všech cookies odeslaných prohlížečem
  • $_REQUEST – obsahuje všechny kombinace klíč/hodnota, které jsou obsaženy v polích $_GET, $_POST, $_COOKIE
  • $_FILES - obsahuje seznam všech souborů stažených prohlížečem
  • $_SESSION - umožňuje ukládat a používat proměnné relace pro aktuální prohlížeč
  • $_SERVER - obsahuje informace o serveru, jako je název souboru spouštěného skriptu a IP adresa prohlížeče.
  • $_ENV - obsahuje seznam proměnných prostředí předávaných do PHP, jako jsou proměnné CGI.
Můžete například použít $_GET k získání hodnot proměnných uzavřených v řetězci URL požadavku skriptu a jejich zobrazení na stránce:

Pokud výše uvedený skript spustíte pomocí adresy URL http://www.example.com/script.php?vašeJméno=Fred, vypíše:

Ahoj Frede!

Varování! Ve skutečném skriptu by se takový přenos dat neměl nikdy používat kvůli slabému zabezpečení. Data byste měli vždy ověřit nebo filtrovat.

Superglobal $GLOBALS se velmi pohodlně používá, protože vám umožňuje organizovat přístup ke globálním proměnným ve funkci bez potřeby globálního klíčového slova. Například:

"; ) sayHello(); // Vytiskne "Ahoj, Zoyo!" ?>

Statické proměnné: jsou někde poblíž

Když vytvoříte lokální proměnnou uvnitř funkce, existuje pouze tehdy, když je funkce spuštěna. Po dokončení funkce lokální proměnná zmizí. Při opětovném volání funkce se vytvoří nová lokální proměnná.

Ve většině případů to funguje skvěle. Funkce jsou tedy samostatné a při každém volání fungují vždy stejně.

Existují však situace, kdy by bylo vhodné vytvořit lokální proměnnou, která si mezi voláními funkcí „pamatuje“ svou hodnotu. Taková proměnná se nazývá statická.

Chcete-li vytvořit statickou proměnnou ve funkci, musíte před názvem proměnné použít klíčové slovo static a nezapomeňte mu dát počáteční hodnotu. Například:

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

Uvažujme situaci, kdy je vhodné použít statickou proměnnou. Řekněme, že vytvoříte funkci, která po zavolání vytvoří widget a zobrazí počet již vytvořených widgetů. Můžete zkusit napsat kód takto pomocí lokální proměnné:


"; echo createWidget() ." jsme již vytvořili.
"; echo createWidget() ." jsme již vytvořili.>
"; ?>

Ale protože proměnná $numWidgets je vytvořena pokaždé, když je funkce volána, dostaneme následující výsledek:

Vytváříme nějaké widgety... Již jsme vytvořili 1. Vytvořili jsme již 1. Vytvořili jsme již 1.

Ale pomocí statické proměnné můžeme uložit hodnotu z jednoho volání funkce do druhého:

"; echo createWidget() ." jsme již vytvořili.
"; echo createWidget() ." jsme již vytvořili.
"; echo createWidget() ." >už jsme vytvořili.
"; ?>

Nyní skript vytvoří očekávaný výsledek:

Vytváříme nějaké widgety... Již jsme vytvořili 1. Vytvořili jsme již 2. Vytvořili jsme již 3.

I když si statická proměnná uchovává svou hodnotu mezi voláními funkcí, je platná pouze při spuštění skriptu. Jakmile skript dokončí provádění, všechny statické proměnné jsou zničeny, stejně jako lokální a globální proměnné.

To je vše! Často si prostudujte dokumentaci PHP.

Zde je třeba poznamenat, že prvek kódu, který jste předložili, by měl být považován za špatný design a styl programování, protože zachází se zahrnutým souborem jako s okamžitě spustitelnou sadou operací.

Nejsprávnějším přístupem by bylo umístit množinu operací jako funkce/třídy s vlastním názvem do souboru, zahrnout soubor (bez jakéhokoli příkazu return mimo funkce) a poté funkci zavolat. očividně s požadovanou sadou argumentů.

Tak co je za problém?

Vše je velmi jednoduché, uděláte to zahrnout uvnitř metody metoda, což znamená, že proměnné specifikované v přiloženém souboru jsou inicializovány v rozsahu metody metoda. Proto proměnná $lang není globální a je omezena viditelností metody a přistupujete ke globální proměnné, takže při použití modifikátoru globální bude se rovnat nule.

Pokud zahrnete do globálního rozsahu, pak se proměnná lang stane veřejnou (globální) a její použití bude možné. To je snadné zkontrolovat, do přiloženého souboru, než začnete definovat jakoukoli proměnnou, stačí napsat globální proměnná $.

Příklad:

zahrnout "soubor1.php"; function include2() ( include "file2.php"; )
  • soubor1.php je definován v globálním rozsahu.
  • file2.php je definován v lokálním rozsahu funkce include2.

Přístup s globálními proměnnými a takovými include je berlička, která vám v budoucnu přinese problémy. Funkce musí být explicitně definovány, musí mít jedinečný název a musí být spouštěny na vyžádání.

Proč je přístup s globálními proměnnými špatný?

Jde o to, že globální proměnné jsou viditelné odkudkoliv, globálně. To je výhodné: neexistují žádná omezení. Na druhou stranu je zcela nemožné sledovat, kdo data mění. Nekontrolované změny jsou první věcí, která se obvykle vybaví při otázce, proč jsou globální proměnné špatné.

Řekněme, že máte funkci, jejíž výsledek závisí na globální proměnné. Voláte to, voláte to, ale po 10 minutách funkce začne vracet nesprávné výsledky. Co se stalo? Koneckonců, předáváte mu stejnou sadu parametrů jako vstup? Hmm, někdo změnil hodnotu globální proměnné... Kdo by to mohl být? Ano, kdokoli - vždyť globální proměnná je dostupná všem..

Nejlepší recept na navrhování podprogramů je: aby výsledek vaší funkce závisel pouze na argumentech. To je ideál, o který je třeba usilovat.

Nepoužívejte ve svém projektu zbytečně globální proměnné, využijte všech funkcí místního rozsahu, předávání parametrů argumentům funkcí a kód se bude snadněji psát, udržovat a testovat.

Víte, jaká je nejlepší předpona pro globální proměnné?

Proměnné definované v rámci podprogramu (uživatelem definovaná funkce). Jsou přístupné pouze v rámci funkce, ve které jsou definovány.

Pro PHP jsou všechny proměnné deklarované a používané ve funkci ve výchozím nastavení lokální. To znamená, že ve výchozím nastavení není možné změnit hodnotu globální proměnné v těle funkce.

Pokud v těle uživatelem definované funkce použijete proměnnou se jménem shodným se jménem globální proměnné (umístěné mimo uživatelsky definovanou funkci), pak tato lokální proměnná nebude mít žádný vztah ke globální proměnné. V této situaci se v uživatelsky definované funkci vytvoří lokální proměnná se jménem shodným s názvem globální proměnné, ale tato lokální proměnná bude dostupná pouze v rámci této uživatelsky definované funkce.

Vysvětlíme si tuto skutečnost na konkrétním příkladu:

$a = 100;

funkce function() (
$a = 70;
echo"

$a

" ;
}
funkce();
echo"

$a

" ;
?>

Skript nejprve vytiskne 70 a poté 100:

70
100

Abychom se zbavili tohoto nedostatku, existuje speciální instrukce v PHP globální, což umožňuje uživatelsky definované funkci pracovat s globálními proměnnými. Podívejme se na tento princip na konkrétních příkladech:

$a = 1;
$b = 2;

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

$b = $a + $b ;
}

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

Výše uvedený skript vypíše " 3 Po definování $a A $ b uvnitř funkce jako globální 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é lze zpracovat uživatelsky definovanými funkcemi, 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:

Použití $GLOBALS namísto globálního:

$a = 1;
$b = 2;

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

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

$GLOBALS je asociativní pole, jehož klíčem je jméno a jehož hodnotou je obsah globální proměnné. Všimněte si, že $GLOBALS existuje v jakémkoli oboru, protože se jedná o pole. Níže je uveden příklad demonstrující schopnosti superglobálů:

funkce test_global()
{
// Většina předdefinovaných proměnných není
// "super" a bude dostupný v místní oblasti
// viditelnost funkce vyžaduje 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 dostupné od PHP 4.1.0
echo $_POST ["jméno" ];
}
?>