Php7 - PHP: globale brenda një funksioni nuk tregon një variabël - Stack Overflow në Rusisht. Shtrirja e variablave PHP. Gjithçka që dëshironit të dinit, por kishit frikë të pyesni Printoni një ndryshore globale php jashtë një funksioni

Përditësimi i fundit: 1/11/2015

Kur përdorni variabla dhe funksione, merrni parasysh shtrirjen e variablave. Fushëveprimi specifikon fushën e veprimit dhe aksesueshmërinë e një ndryshoreje të caktuar.

Variablat lokale

Variablat lokale krijohen brenda një funksioni. Variabla të tillë mund të aksesohen vetëm nga brenda një funksioni të caktuar. Për shembull:

Në këtë rast, funksioni get() përcakton një ndryshore lokale $result . Dhe nga konteksti i përgjithshëm nuk mund t'i qasemi, domethënë, shkruaj $a = $rezultat; Kjo nuk është e mundur sepse shtrirja e ndryshores $result është e kufizuar nga funksioni get(). Jashtë këtij funksioni, ndryshorja $result nuk ekziston.

E njëjta gjë vlen edhe për parametrat e funksionit: jashtë funksionit, parametrat $lowlimit dhe $highlimit gjithashtu nuk ekzistojnë.

Si rregull, variablat lokale ruajnë disa rezultate të ndërmjetme të llogaritjeve, si në shembullin e mësipërm.

Variablat statike

Ndryshoret statike janë të ngjashme me variablat lokale. Ato ndryshojnë në atë që pas përfundimit të funksionit, vlera e tyre ruhet. Sa herë që thirret funksioni, ai përdor vlerën e ruajtur më parë. Për shembull:

Për të treguar se një ndryshore do të jetë statike, fjalës kyçe static i shtohet asaj. Me tre thirrje të njëpasnjëshme në getCounter(), ndryshorja $counter do të rritet me një.

Nëse ndryshorja $counter do të ishte një ndryshore e rregullt jostatike, atëherë getCounter() do të printonte 1 sa herë që thirrej.

Në mënyrë tipike, variablat statike përdoren për të krijuar numërues të ndryshëm, si në shembullin e mësipërm.

Variablat Globalë

Ndonjëherë dëshironi që një variabël të jetë i disponueshëm kudo, globalisht. Variabla të tillë mund të ruajnë disa të dhëna të përbashkëta për të gjithë programin. Për të përcaktuar variablat globale, përdorni fjalën kyçe globale:1

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

Pas thirrjes së funksionit getGlobal(), ndryshorja $gvar mund të aksesohet nga çdo pjesë e programit.

Shënimi: Aktivizohet versioni adaptiv i faqes, i cili përshtatet automatikisht me madhësinë e vogël të shfletuesit tuaj dhe fsheh disa detaje të faqes për lehtësinë e leximit. Shijojeni shikimin!

Përshëndetje të dashur lexues të blogut Faqe në! Në mësuam se ekziston një funksion në PHP, mësuam se si të krijojmë funksionet tona, t'u kalojmë atyre argumente dhe t'i thërrasim për ekzekutim. Duke vazhduar temën e funksioneve në PHP, është e nevojshme të theksohen gjërat e mëposhtme:

  • Brenda funksionit, mund të përdorni çdo kod PHP (cikle, kushte, çdo operacion), duke përfshirë funksione të tjera (të integruara dhe të personalizuara);
  • Emri i funksionit duhet të fillojë me një shkronjë latine ose një nënvizim, e ndjekur nga çdo numër shkronjash, numrash ose nënvizash latine;
  • Të gjitha funksionet kanë shtrirje globale, që do të thotë se çdo funksion mund të thirret kudo, edhe nëse ai funksion është i përcaktuar brenda një tjetri;
  • PHP nuk mbështet mbingarkimin e funksionit; gjithashtu nuk ka mundësi për të ripërcaktuar (ndryshuar, shtuar) ose fshirë një funksion të krijuar;
  • Funksionet nuk duhet të përcaktohen përpara se të përdoren. Kjo do të thotë, nëse së pari thërrisni një funksion dhe vetëm atëherë e përshkruani atë në kodin më poshtë, kjo nuk do të ndikojë në performancën dhe nuk do të shkaktojë gabime.

Funksionet e kushtëzuara

Ne mund të krijojmë (përcaktojmë, përshkruajmë) një funksion në varësi të gjendjes. Për shembull:

//i quajtur funksioni sayHi, ai mund të thirret kudo /*funksioni sayGoodbye nuk mund të thirret këtu, pasi ne nuk e kemi kontrolluar ende gjendjen dhe nuk kemi hyrë brenda konstruksionit if*/ if($apply)(funksioni sayGoodbye())( jehonë "Mirupafshim të gjithëve!
"; } } /*tani mund të thërrasim thuaj lamtumirë*/
"; }

Rezultati:

Dhe hidhini një sy këtij shembulli:

/*dhe kjo është ajo që do të ndodhë nëse ju telefononi thuaj mirupafshim këtu*/ thuaj mirupafshim(); if($apply)(funksioni sayGoodbye())( jehonë "Mirupafshim të gjithëve!
"; ) ) funksioni sayHi())( echo "Përshëndetje të gjithëve!
"; }

Rezultati:

Në fakt, aq sa kam punuar, nuk kam parë askund diçka të tillë, por duhet të keni parasysh të gjitha mundësitë e gjuhës.

Funksionet e mbivendosura

Një funksion i ndërthurur është një funksion i deklaruar brenda një funksioni tjetër. Shembull:

/*Nuk mund të telefononi sayGoodbye këtu, pasi do të shfaqet vetëm pasi të telefononi funksionin sayHi*/ thuaj përshëndetje(); /* thirrni funksionin sayHi, ai mund të thirret kudo*/ /*Tani mund të thërrasim thuaj lamtumirë*/ thuaj mirupafshim(); funksioni sayHi()) (echo "Përshëndetje të gjithëve!
"; funksioni say Goodbye())( echo "Mirupafshim të gjithëve!
"; } }

Përsëri, në kalimin e parë, përkthyesi PHP shënon veten se ka gjetur një përshkrim të funksionit sayHi, por nuk hyn brenda trupit të tij, ai sheh vetëm emrin, dhe meqenëse përkthyesi nuk hyn brenda trupit të sayHi, atëherë nuk e ka idenë se çfarë po përcaktojmë brenda një funksioni tjetër - thuaj Mirupafshim.

Pastaj kodi fillon të ekzekutohet, ne e quajmë sayHi, përkthyesi PHP duhet të hyjë në trupin e funksionit sayHi për ta ekzekutuar atë dhe aty gjen aksidentalisht përshkrimin e një funksioni tjetër - say Goodbye, pas së cilës sayGoodbye mund të thirret kudo, po aq herë. si të duash.

Por ia vlen t'i kushtohet vëmendje një pike shumë delikate në situatën e mësipërme: funksioni sayHi bëhet një herë, sepse nëse e thërrasim përsëri, PHP do të hasë përsëri përkufizimin e funksionit sayGoodbye, dhe në PHP nuk mund ta bëni. kjo - nuk mund të anashkaloni funksionet. Kam shkruar për këtë dhe si ta trajtojmë atë në një artikull të mëparshëm.

Në PHP, teknikat e përshkruara më sipër përdoren shumë rrallë; ato mund të shihen më shpesh, për shembull, në JavaScript.

Fusha e ndryshueshme

Ekzistojnë saktësisht dy fusha në PHP: globale Dhe lokal. Çdo gjuhë programimi strukturohet ndryshe. Për shembull, në C++, edhe sythe kanë shtrirjen e tyre (lokale). Në PHP, nga rruga, kjo është një shtrirje globale. Por sot po flasim për funksione.

Funksionet në PHP kanë shtrirjen e tyre të brendshme (lokale), domethënë, të gjitha variablat brenda një funksioni janë të dukshme vetëm brenda këtij funksioni.

Pra, edhe një herë: gjithçka jashtë funksioneve është fushëveprimi global, gjithçka brenda funksioneve është fushëveprimi lokal. Shembull:

Të nderuar ekspertë, vëmendje, pyetje! Çfarë do të dalë udhëzimi i fundit? jehonë $emri; ?

Siç e patë vetë, ne kishim 2 variabla $emri, njëra brenda funksionit (sfera lokale), tjetra vetëm në kod (sfera globale), caktimi i fundit për një ndryshore $emri ishte $name = "Rud Sergey"; Por duke qenë se ishte brenda funksionit, mbeti aty. Në shtrirjen globale, detyra e fundit ishte $emri = "Andrey"; e cila është ajo që ne në fakt shohim si rezultat.

Kjo do të thotë, dy ndryshore identike, por në shtrirje të ndryshme ato nuk kryqëzohen dhe nuk ndikojnë në njëra-tjetrën.

Më lejoni të ilustroj shtrirjen në figurë:

Gjatë kalimit të parë, përkthyesi skanon shkurtimisht shtrirjen globale, kujton se cilat variabla dhe funksione ekzistojnë, por nuk e ekzekuton kodin.

Qasja në variablat globale nga shtrirja lokale

Por, çka nëse ende na duhet të aksesojmë të njëjtën ndryshore $name nga sfera globale nga një funksion, dhe jo vetëm ta aksesojmë atë, por ta ndryshojmë atë? Ekzistojnë 3 opsione kryesore për këtë. E para është duke përdorur një fjalë kyçe globale:

"; emri global; /*tani e tutje nënkuptojmë variablin global $name*/$name = "Rud Sergey"; ) $emri = "Andrey"; thuaj Hi ($emri); jehonë $emri; //?

Rezultati:

Por kjo metodë ka një disavantazh, pasi kemi akses në variablin global $emri humbëm (mbishkruam) një ndryshore lokale $emri.

Mënyra e dytëështë për t'u përdorur Grup superglobal PHP. Vetë PHP vendos automatikisht çdo variabël që kemi krijuar në shtrirjen globale në këtë grup. Shembull:

$emri = "Andrey"; //E njejta si$GLOBALS["name"] = "Andrey";

Prandaj:

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

Rezultati është i njëjtë me përdorimin e fjalës kyçe globale:

Vetëm këtë herë nuk e rishkruam variablin lokal, pra variablin $emri brenda funksioni mbetet i njëjtë dhe është i barabartë "Andrey", por jo "Rud Sergey".

Kalimi i argumenteve me referencë

Mënyra e tretë- ky është transferimi i adresës ( lidhjet) të një ndryshoreje, jo vlera e saj. Lidhjet në PHP nuk janë shumë të suksesshme, ndryshe nga gjuhët e tjera të programimit. Megjithatë, unë do t'ju tregoj opsionin e vetëm të saktë për kalimin e një argumenti duke iu referuar një funksioni, i cili zakonisht mbështetet në PHP 5.3 dhe më të lartë. Ka mënyra të tjera për të punuar me lidhje, por ato funksionuan në PHP 5.2 dhe më të ulët, si rezultat, vetë zhvilluesit e PHP vendosën t'i braktisin ato, kështu që ne nuk do të flasim për to.

Pra, kalimi SAKTË i një argumenti me referencë në PHP 5.3 dhe më lart bëhet si më poshtë:

Funksioni sayHi(& $name)(

Në vetë përshkrimin e funksionit, ne shtuam një ikonë ampersand (&) - kjo ikonë do të thotë që ne nuk pranojmë vlerën e ndryshores, por një lidhje (adresa) për këtë vlerë në memorie. Referencat në PHP ju lejojnë të krijoni dy variabla që tregojnë të njëjtën vlerë. Kjo do të thotë që kur një nga këto variabla ndryshon, të dyja ndryshojnë, pasi i referohen të njëjtës vlerë në memorie.

Dhe në fund kemi:

//pranoni jo një vlerë, por një referencë për vlerën jehonë "Përshëndetje, ".$name."!
"; $name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

Rezultati:

Variablat statike

Imagjinoni situatën e mëposhtme: duhet të numërojmë sa herë kemi thënë përshëndetje në total. Ja çfarë po përpiqemi të bëjmë:

"; $c++; // rrit numrin me 1


Rezultati:

E ndryshueshme $c nuk e kujton kuptimin e saj, ajo krijohet rishtas çdo herë. Ne duhet të bëjmë variablin tonë lokal $c kujtuan vlerën e tij pas ekzekutimit të funksionit, për këtë ata përdorin një fjalë kyçe statike:

// numërues, i bërë statik jehonë "Përshëndetje, ".$name."!
"; $c++; // rrit numrin me 1 echo "Sapo thashë përshëndetje". $c. "një herë.


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

Rezultati:

Kthimi i vlerave

Funksionet kanë një gjë kaq të përshtatshme si kthimi i vlerave. Kjo ndodh kur një funksion, në vend që të printojë diçka në ekran, vendos gjithçka në një ndryshore dhe na e jep atë ndryshore. Dhe ne tashmë jemi duke vendosur se çfarë të bëjmë me të. Për shembull, le të marrim këtë funksion, ai vendos në katror një numër:

Rezultati:

Le ta bëjmë atë në mënyrë që në vend që ta shfaqë në ekran, të kthejë rezultatin e ekzekutimit. Për ta bërë këtë, përdorni fjalën kyçe të kthimit:

Rezultati:

Tani mund ta përdorim këtë në mënyra të ndryshme:

// nxjerr rezultatin jehonë"
"; $num = getSquare(5); jehonë $num;

Rezultati:

Ju lutemi vini re se fjala kyçe kthimi jo thjesht kthen një vlerë, por ndërpret plotësisht funksionin, domethënë të gjithë kodin që është poshtë fjalës kyçe kthimi nuk do të përmbushet kurrë. Me fjalë të tjera, kthimi për funksionet gjithashtu funksionon si thyej për sythe:

echo "PHP nuk do të më arrijë kurrë:(";) echo getSquare (5); // nxjerr rezultatin jehonë"
"; $num = getSquare(5); // ia caktoi rezultatin një ndryshoreje jehonë $num; // shfaq variablin në ekran

Rezultati:

Kjo eshte kthimi– kjo është gjithashtu një dalje nga funksioni. Mund të përdoret pa vlerë kthimi, vetëm për hir të prodhimit.

Funksioni rekurziv

Një funksion rekurziv është një funksion që thërret veten. Rekursioni nuk përdoret shpesh dhe konsiderohet një operacion intensiv i burimeve (i ngadalshëm). Por ndodh që përdorimi i rekursionit është opsioni më i dukshëm dhe më i thjeshtë. Shembull:

"; nëse ($number< 20){ // që rekursioni të mos bëhet i pafund countPlease(++$number); // funksioni countPlease thirri veten) ) countPlease(1);

Rezultati:

Nëse dini të bëni pa rekursion, atëherë është më mirë ta bëni këtë.

Shkrimi i fortë në PHP (përsosja e tipit)

PHP ndërmerr hapa të vegjël drejt shtypjes së fortë, kështu që ne mund të specifikojmë paraprakisht se çfarë lloji duhet të marrë një funksion (kjo quhet tip-hind):

Rezultati:

Gabim fatal i kapshëm: Argumenti 1 i kalohet countPlease() duhet të jetë një grup, numër i plotë i dhënë, i thirrur në /home/index.php në rreshtin 7 dhe i përcaktuar në /home/index.php në rreshtin 3

Gabimi na tregon se funksioni pret të marrë një grup, por në vend të kësaj ne po i kalojmë një numër. Fatkeqësisht, tani për tani ne mund të specifikojmë vetëm llojin për (array), dhe me PHP 5.4 kemi shtuar gjithashtu një opsion të tillë si i thirrshëm:

I thirrur kontrollon nëse vlera e kaluar mund të thirret si funksion. I thirrur mund të jetë ose emri i një funksioni të specifikuar nga një variabël vargu, ose një objekt dhe emri i metodës që thirret. Por ne do të flasim për objektet dhe metodat më vonë (kjo është një pjesë e programimit të orientuar nga objekti), por ju tashmë jeni njohur me funksionet. Nuk mund t'ju tregoj rezultatin e punës, pasi aktualisht kam PHP 5.3, por do të ishte:

Quhet funksioni getEcho

Përdorimi i argumenteve me gjatësi të ndryshueshme

Dhe së fundi, një nuancë tjetër e përdorur shumë rrallë. Imagjinoni një situatë: ne i kalojmë argumentet një funksioni, megjithëse nuk i kemi përshkruar ato në funksion, për shembull:

Rezultati:

Siç mund ta shihni, nuk ka gabime, por argumentet tona të kaluara nuk përdoren askund. Por kjo nuk do të thotë se ato janë zhdukur - ato janë kaluar ende në funksion dhe ne mund t'i përdorim ato; ka funksione të integruara PHP për këtë:

func_num_args()- Rikthen numrin e argumenteve të kaluara në funksion
func_get_arg (numri i sekuencës)- Kthen një element nga një listë argumentesh
func_get_args()- Kthen një grup që përmban argumentet e funksionit

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

Rezultati:

konkluzioni

Artikulli i sotëm është i fundit mbi temën e funksioneve në PHP. Tani mund të jeni të sigurt në plotësinë e njohurive tuaja në lidhje me këtë temë dhe mund të përdorni me besim funksionet për nevojat tuaja.

Nëse dikush ka dëshirë të përmirësohet në të, por nuk ka idenë se si ta bëjë këtë, mënyra më e mirë do të ishte të shkruante funksione të gatshme (të integruara) PHP, për shembull, mund të shkruani funksionin tuaj count() apo ndonjë tjetër.

Faleminderit të gjithëve për vëmendjen dhe shihemi përsëri! Nëse diçka nuk është e qartë, mos ngurroni të bëni pyetjet tuaja në komente!

Ky tutorial mbulon fushën e variablave PHP. Shpjegon ndryshimin midis shtrirjes lokale dhe globale, tregon se si të aksesoni variablat globale brenda një funksioni, si të punoni me superglobalët dhe të krijoni variabla statike.

Kur filloni të mësoni PHP dhe filloni të punoni me funksione dhe objekte, shtrirja e variablave është pak konfuze. Për fat të mirë, rregullat e PHP në këtë drejtim janë shumë të lehta për t'u kuptuar (në krahasim me gjuhët e tjera të programimit).

Çfarë është fushëveprimi?

Shtrirja e variablave është konteksti brenda të cilit është përcaktuar ndryshorja dhe ku mund të aksesohet. PHP ka dy fusha të ndryshueshme:

  • Globale- variablat mund të aksesohen kudo në skript
  • Lokal- variablat mund të aksesohen vetëm brenda funksionit në të cilin janë përcaktuar

Shtrirja e një ndryshoreje, dhe veçanërisht ajo lokale, thjeshton shumë menaxhimin e kodit. Nëse të gjitha variablat ishin globale, atëherë ato mund të ndryshoheshin kudo në skript. Kjo do të çonte në kaos dhe skripte të mëdha, pasi shumë shpesh pjesë të ndryshme të skriptit përdorin variabla me të njëjtin emra. Duke kufizuar shtrirjen në kontekstin lokal, ju përcaktoni kufijtë e kodit që mund të aksesojë një ndryshore, gjë që e bën kodin më të fortë, modular dhe më të lehtë për të korrigjuar gabimet.

Variablat me shtrirje globale quhen globale, dhe variablat me shtrirje lokale quhen lokale.

Këtu është një shembull se si funksionojnë variablat globale dhe lokale.

"; ) sayHello(); echo "Vlera e \$globalName: "$globalName"
"; jehonë "\$localName vlera: "$localName"
"; ?>

Përshëndetje Harry! Vlera e $globalName: "Zoe" vlera e $localName: ""

Në këtë skript kemi krijuar dy variabla:

  • $globalName- Kjo globale e ndryshueshme
  • $localName- Kjo lokal një variabël që krijohet brenda funksionit sayHello().

Pas krijimit të ndryshores dhe funksionit, skripti thërret sayHello(), i cili printon "Hello Harry!" . Më pas skripti përpiqet të nxjerrë vlerat e dy variablave duke përdorur funksionin echo. Ja çfarë ndodh:

  • Sepse $globalNameështë krijuar jashtë funksionit, është i disponueshëm kudo në skript, kështu që "Zoe" del jashtë.
  • $localName do të jetë i disponueshëm vetëm brenda funksionit sayHello(). Meqenëse shprehja e jehonës është jashtë funksionit, PHP nuk ofron akses në variablin lokal. Në vend të kësaj, PHP pret që kodi të krijojë një ndryshore të re të quajtur $localName, e cila do të ketë një vlerë të paracaktuar të vargut bosh. kjo është arsyeja pse thirrja e dytë për echo nxjerr vlerën "" për ndryshoren $localName.

Qasja në variablat globale brenda një funksioni

Për të hyrë në një ndryshore globale jashtë funksionit Mjafton thjesht të shkruani emrin e saj. Por për të hyrë në një ndryshore globale brenda një funksioni, fillimisht duhet të deklaroni variablin si global në funksion duke përdorur fjalën kyçe globale:

Funksioni myFunction() ( global $globalVariable; // Hyni në variablin global $globalVariable )

Nëse nuk e bëni këtë, PHP supozon se po krijoni ose përdorni një ndryshore lokale.

Këtu është një shembull skripti që përdor një ndryshore globale brenda një funksioni:

"; global $globalName; jehonë "Përshëndetje $globalName!
"; ) sayHello(); ?>

Kur të ekzekutohet, skripti do të dalë:

Përshëndetje Harry! Përshëndetje Zoya!

Funksioni sayHello() përdor fjalën kyçe globale për të deklaruar variablin $globalName si global. Më pas, ajo mund të hyjë në variablin dhe të nxjerrë vlerën e saj ("Zoe").

Çfarë janë superglobalët?

PHP ka një grup të veçantë vargjesh globale të paracaktuara që përmbajnë informacione të ndryshme. Vargje të tilla quhen superglobalët, pasi ato janë të aksesueshme nga kudo në skript, duke përfshirë hapësirën e brendshme të funksioneve, dhe nuk kanë nevojë të përcaktohen duke përdorur fjalën kyçe globale.

Këtu është një listë e superglobalëve të disponueshëm në versionin 5.3 të PHP:

  • $GLOBALS - lista e të gjitha variablave globale në skript (duke përjashtuar superglobalët)
  • $_GET - përmban një listë të të gjitha fushave të formularit të paraqitura nga shfletuesi duke përdorur një kërkesë GET
  • $_POST - përmban një listë të të gjitha fushave të formularit të dërguar nga shfletuesi duke përdorur një kërkesë POST
  • $_COOKIE - përmban një listë të të gjitha cookie-ve të dërguara nga shfletuesi
  • $_REQUEST - përmban të gjitha kombinimet e çelësave/vlerave që gjenden në grupet $_GET, $_POST, $_COOKIE
  • $_FILES - përmban një listë të të gjithë skedarëve të shkarkuar nga shfletuesi
  • $_SESSION - ju lejon të ruani dhe përdorni variablat e sesionit për shfletuesin aktual
  • $_SERVER - përmban informacione rreth serverit, si emri i skedarit të skriptit që po ekzekutohet dhe adresa IP e shfletuesit.
  • $_ENV - përmban një listë të variablave të mjedisit të kaluar në PHP, siç janë variablat CGI.
Për shembull, mund të përdorni $_GET për të marrë vlerat e variablave të mbyllura në vargun e URL-së së kërkesës së një skripti dhe t'i shfaqni ato në faqe:

Nëse ekzekutoni skriptin e mësipërm duke përdorur URL-në http://www.example.com/script.php?yourName=Fred, ai do të dalë:

Përshëndetje Fred!

Paralajmërim! Në një skenar të vërtetë, një transferim i tillë i të dhënave nuk duhet të përdoret kurrë për shkak të sigurisë së dobët. Gjithmonë duhet të verifikoni ose filtroni të dhënat.

Superglobal $GLOBALS është shumë i përshtatshëm për t'u përdorur sepse ju lejon të organizoni aksesin në variablat globale në një funksion pa pasur nevojë për fjalën kyçe globale. Për shembull:

"; ) sayHello(); // Shtyp "Përshëndetje, Zoya!" ?>

Ndryshoret statike: ato janë diku përreth

Kur krijoni një ndryshore lokale brenda një funksioni, ajo ekziston vetëm kur funksioni është duke u ekzekutuar. Kur funksioni përfundon, ndryshorja lokale zhduket. Kur funksioni thirret përsëri, krijohet një ndryshore e re lokale.

Në shumicën e rasteve kjo funksionon shkëlqyeshëm. Kështu, funksionet janë të pavarura dhe funksionojnë gjithmonë njësoj sa herë që thirren.

Megjithatë, ka situata ku do të ishte e përshtatshme të krijohej një ndryshore lokale që "kujton" vlerën e saj midis thirrjeve të funksionit. Një variabël i tillë quhet statik.

Për të krijuar një ndryshore statike në një funksion, duhet të përdorni fjalën kyçe statike përpara emrit të ndryshores dhe sigurohuni që t'i jepni një vlerë fillestare. Për shembull:

Funksioni myFunction() ( statik $myVariable = 0; )

Le të shqyrtojmë një situatë kur është e përshtatshme të përdoret një ndryshore statike. Le të themi se keni krijuar një funksion që, kur thirret, krijon një miniaplikacion dhe shfaq numrin e miniaplikacioneve të krijuara tashmë. Mund të provoni të shkruani kod si ky duke përdorur një ndryshore lokale:


"; echo createWidget() ." ne kemi krijuar tashmë.
"; echo createWidget() . " kemi krijuar tashmë.>
"; ?>

Por, meqenëse ndryshorja $numWidgets krijohet sa herë që thirret funksioni, ne do të marrim rezultatin e mëposhtëm:

Ne krijojmë disa miniaplikacione... Kemi krijuar tashmë 1. Ne kemi krijuar tashmë 1. Ne kemi krijuar tashmë 1.

Por duke përdorur një ndryshore statike, ne mund të ruajmë vlerën nga një thirrje funksioni në tjetrën:

"; echo createWidget() ." ne kemi krijuar tashmë.
"; echo createWidget() ." ne kemi krijuar tashmë.
"; echo createWidget() . " >ne kemi krijuar tashmë.
"; ?>

Tani skenari do të prodhojë rezultatin e pritur:

Ne krijojmë disa miniaplikacione... Kemi krijuar tashmë 1. Ne kemi krijuar tashmë 2. Ne kemi krijuar tashmë 3.

Edhe pse një ndryshore statike ruan vlerën e saj midis thirrjeve të funksionit, ajo është e vlefshme vetëm kur skripti është duke u ekzekutuar. Pasi skripti të përfundojë ekzekutimin, të gjitha variablat statike shkatërrohen, si dhe variablat lokale dhe globale.

Kjo eshte e gjitha! Ju lutemi referojuni dokumentacionit tuaj PHP shpesh.

Gjëja që duhet të theksohet këtu është se elementi i kodit që keni paraqitur duhet të konsiderohet si dizajn i keq dhe stil programimi, sepse e trajton skedarin e përfshirë si një grup operacionesh të ekzekutueshme në çast.

Qasja më e saktë do të ishte vendosja e grupit të operacioneve si funksione/klasa me emrin e tyre në një skedar, përfshirja e skedarit (pa ndonjë deklaratë kthimi jashtë funksioneve) dhe më pas thirrja e funksionit padyshim me grupin e kërkuar të argumenteve.

Pra, cili është problemi?

Gjithçka është jashtëzakonisht e thjeshtë, ju e bëni atë përfshijnë brenda një metode metodë, që do të thotë se variablat e specifikuar në skedarin e përfshirë janë inicializuar në fushëveprimin e metodës metodë. Prandaj, ndryshorja $lang nuk është globale dhe kufizohet nga dukshmëria e metodës, dhe ju jeni duke hyrë në një ndryshore globale, kështu që kur përdorni modifikuesin globale do të jetë e barabartë me null.

Nëse përfshini në shtrirjen globale, atëherë ndryshorja lang do të bëhet publike (globale) dhe përdorimi i saj do të bëhet i mundur. Kjo është e lehtë për t'u kontrolluar; në skedarin e përfshirë, përpara se të filloni të përcaktoni ndonjë variabël, thjesht shkruani variabël globale $.

Shembull:

përfshini "file1.php"; funksioni include2() (përfshi "file2.php"; )
  • file1.php është përcaktuar në shtrirje globale.
  • file2.php është përcaktuar në shtrirjen lokale të funksionit include2.

Qasja me variabla globale dhe përfshirje të tilla është një patericë që do t'ju sjellë probleme në të ardhmen. Funksionet duhet të përcaktohen në mënyrë eksplicite, të kenë një emër unik dhe të ekzekutohen sipas kërkesës.

Pse është e keqe qasja me variabla globale?

Çështja është se variablat globale janë të dukshme nga kudo, globalisht. Kjo është e përshtatshme: nuk ka kufizime. Nga ana tjetër, bëhet krejtësisht e pamundur të gjurmosh se kush i ndryshon të dhënat. Ndryshimet e pakontrolluara janë gjëja e parë që zakonisht vjen në mendje kur pyeten pse variablat globalë janë të këqij.

Le të themi se keni një funksion, rezultati i të cilit varet nga një ndryshore globale. Ju e telefononi, telefononi, por pas 10 minutash funksioni fillon të kthejë rezultate të pasakta. Cfare ndodhi? Në fund të fundit, po i kaloni të njëjtin grup parametrash si hyrje? Hmm, dikush ndryshoi vlerën e një ndryshoreje globale... Kush mund të jetë? Po, kushdo - në fund të fundit, një variabël global është i disponueshëm për të gjithë..

Receta më e mirë për hartimin e nënprogrameve është: bëni që rezultati i funksionit tuaj të varet vetëm nga argumentet. Ky është një ideal për t'u përpjekur.

Mos përdorni variabla globale në projektin tuaj në mënyrë të panevojshme, përfitoni nga të gjitha tiparet e shtrirjes lokale, duke kaluar parametrat në argumentet e funksionit dhe kodi do të jetë më i lehtë për t'u shkruar, ruajtur dhe testuar.

A e dini se cili është prefiksi më i mirë për variablat globale?

Variablat e përcaktuar brenda një nënprogrami (funksioni i përcaktuar nga përdoruesi). Ato janë të aksesueshme vetëm brenda funksionit në të cilin janë përcaktuar.

Për PHP, të gjitha variablat e deklaruara dhe të përdorura në një funksion janë lokale të funksionit si parazgjedhje. Kjo do të thotë, si parazgjedhje nuk është e mundur të ndryshohet vlera e një ndryshoreje globale në trupin e një funksioni.

Nëse në trupin e një funksioni të përcaktuar nga përdoruesi përdorni një ndryshore me një emër identik me emrin e një ndryshoreje globale (e vendosur jashtë funksionit të përcaktuar nga përdoruesi), atëherë kjo ndryshore lokale nuk do të ketë asnjë lidhje me variablin global. Në këtë situatë, një ndryshore lokale me një emër identik me emrin e ndryshores globale do të krijohet në funksionin e përcaktuar nga përdoruesi, por kjo ndryshore lokale do të jetë e disponueshme vetëm brenda këtij funksioni të përcaktuar nga përdoruesi.

Le ta shpjegojmë këtë fakt me një shembull specifik:

$a = 100 ;

funksioni i funksionit () (
$a = 70 ;
jehonë"

$a

" ;
}
funksioni ();
jehonë"

$a

" ;
?>

Skripti do të printojë fillimisht 70 dhe më pas 100:

70
100

Për të hequr qafe këtë pengesë, ekziston një udhëzim i veçantë në PHP globale, duke lejuar një funksion të përcaktuar nga përdoruesi të punojë me variabla globale. Le ta shohim këtë parim duke përdorur shembuj specifikë:

$a = 1 ;
$b = 2 ;

Shuma e funksionit ()
{
globale $a, $b;

$b = $a + $b ;
}

Shuma ();
jehonë $b ;
?>

Skripti i mësipërm do të dalë " 3 “.Pas përcaktimit $a Dhe $b brenda funksionit si globale të gjitha referencat për cilindo prej këtyre variablave do të tregojnë versionin e tyre global. Nuk ka kufi për numrin e variablave globale që mund të trajtohen nga funksionet e përcaktuara nga përdoruesi.

Mënyra e dytë për të hyrë në variablat e shtrirjes globale është përdorimi i një grupi të veçantë të përcaktuar nga PHP $GLOBALE. Shembulli i mëparshëm mund të rishkruhet kështu:

Përdorimi i $GLOBALS në vend të globalit:

$a = 1 ;
$b = 2 ;

Shuma e funksionit ()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}

Shuma ();
jehonë $b ;
?>

$GLOBALEështë një grup shoqërues, çelësi i të cilit është emri dhe vlera e të cilit është përmbajtja e ndryshores globale. Vini re se $GLOBALS ekziston në çdo fushë, kjo ndodh sepse ky është një grup. Më poshtë është një shembull që demonstron aftësitë e superglobalëve:

funksioni test_global()
{
// Shumica e variablave të paracaktuar nuk janë
// "super" dhe të jetë i disponueshëm në zonën lokale
// dukshmëria e funksionit kërkon që të specifikohet "global".
globale $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS["emri"];

// Superglobalët janë të disponueshëm në çdo fushë
// dukshmëri dhe nuk kërkojnë që të specifikohet "global".
// Superglobalët janë të disponueshëm që nga PHP 4.1.0
echo $_POST ["emri"];
}
?>