Php7 - PHP: global inne i en funksjon viser ikke en variabel - Stack Overflow på russisk. Omfanget av PHP-variabler. Alt du ville vite, men var redd for å spørre Skriv ut en global php-variabel utenfor en funksjon

Sist oppdatert: 1.11.2015

Når du bruker variabler og funksjoner, bør du vurdere variabelt omfang. Omfanget spesifiserer handlingsrom og tilgjengelighet for en gitt variabel.

Lokale variabler

Lokale variabler opprettes inne i en funksjon. Slike variabler kan bare nås fra en gitt funksjon. For eksempel:

I dette tilfellet definerer get()-funksjonen en lokal variabel $result . Og fra den generelle konteksten kan vi ikke få tilgang til det, det vil si å skrive $a = $result; Dette er ikke mulig fordi omfanget av $result-variabelen er begrenset av get()-funksjonen. Utenfor denne funksjonen eksisterer ikke $result-variabelen.

Det samme gjelder funksjonsparametere: utenfor funksjonen eksisterer heller ikke parameterne $lowlimit og $highlimit.

Som regel lagrer lokale variabler noen mellomresultater av beregninger, som i eksemplet ovenfor.

Statiske variabler

Statiske variabler ligner på lokale variabler. De er forskjellige ved at etter at funksjonen er fullført, lagres verdien deres. Hver gang funksjonen kalles opp, bruker den den tidligere lagrede verdien. For eksempel:

For å indikere at en variabel vil være statisk, legges nøkkelordet statisk til den. Med tre påfølgende kall til getCounter(), vil $counter-variabelen økes med én.

Hvis $counter-variabelen var en vanlig ikke-statisk variabel, ville getCounter() skrevet ut 1 hver gang den ble kalt.

Vanligvis brukes statiske variabler til å lage ulike tellere, som i eksemplet ovenfor.

Globale variabler

Noen ganger vil du at en variabel skal være tilgjengelig overalt, globalt. Slike variabler kan lagre noen data som er felles for hele programmet. For å definere globale variabler, bruk det globale nøkkelordet:1

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

Etter å ha kalt getGlobal()-funksjonen, kan $gvar-variabelen nås fra hvilken som helst del av programmet.

Notatet: Den adaptive versjonen av nettstedet er aktivert, som automatisk tilpasser seg den lille størrelsen på nettleseren din og skjuler noen detaljer om nettstedet for enkel lesing. Nyt å se!

Hei kjære blogglesere Nettstedet på! I lærte vi at det er en funksjon i PHP, vi lærte hvordan vi lager våre egne funksjoner, sender argumenter til dem og kaller dem for kjøring. Fortsetter temaet funksjoner i PHP, er det nødvendig å understreke følgende ting:

  • Inne i funksjonen kan du bruke hvilken som helst PHP-kode (sykluser, betingelser, alle operasjoner), inkludert andre funksjoner (både innebygd og tilpasset);
  • Funksjonsnavnet må begynne med en latinsk bokstav eller et understrek, etterfulgt av et hvilket som helst antall latinske bokstaver, tall eller understreking;
  • Alle funksjoner har globalt omfang, noe som betyr at enhver funksjon kan kalles hvor som helst, selv om den funksjonen er definert i en annen;
  • PHP støtter ikke funksjonsoverbelastning, det er heller ingen mulighet for å redefinere (endre, legge til) eller slette en opprettet funksjon;
  • Funksjoner må ikke defineres før de tas i bruk. Det vil si at hvis du først kaller en funksjon, og først deretter beskriver den i koden nedenfor, vil dette ikke påvirke ytelsen og ikke forårsake feil.

Betingede funksjoner

Vi kan lage (definere, beskrive) en funksjon avhengig av betingelsen. For eksempel:

//kalt funksjonen si hei, den kan kalles hvor som helst /*sayGoodbye-funksjonen kan ikke kalles her, siden vi ennå ikke har sjekket tilstanden og ikke har gått inn i if-konstruksjonen*/ if($apply)( function sayGoodbye())( ekko "Hei alle sammen!
"; } } /*nå kan vi ringe si farvel*/
"; }

Resultat:

Og ta en titt på dette eksemplet:

/*og dette er hva som vil skje hvis du ringer si farvel her*/ si farvel(); if($apply)( function sayGoodbye())( ekko "Hei alle sammen!
"; ) ) function sayHi())( echo "Hei alle sammen!
"; }

Resultat:

Faktisk, så mye som jeg har jobbet, har jeg aldri sett noe lignende noe sted, men du må huske på alle mulighetene til språket.

Nestede funksjoner

En nestet funksjon er en funksjon som er deklarert inne i en annen funksjon. Eksempel:

/*Du kan ikke ringe sayGoodbye her, siden den vises først etter at du har ringt sayHi-funksjonen*/ si hei(); /*kall funksjonen si hei, den kan kalles hvor som helst*/ /*Nå kan vi ringe si farvel*/ si farvel(); function sayHi())( ekko "Hei alle sammen!
"; function sayGoodbye())( echo "Hei alle sammen!
"; } }

Igjen, på den første traverseringen, markerer PHP-tolken seg selv at den har funnet en beskrivelse av sayHi-funksjonen, men går ikke inn i kroppen sin, den ser bare navnet, og siden tolken ikke går inn i kroppen til sayHi, da har den ingen anelse om hva vi definerer i en annen funksjon – si farvel.

Så begynner koden å kjøre, vi kaller sayHi, PHP-tolkeren må gå inn i kroppen til sayHi-funksjonen for å utføre den og der finner den ved et uhell beskrivelsen av en annen funksjon - sayGoodbye, hvoretter sayGoodbye kan kalles hvor som helst, like mange ganger som du liker.

Men det er verdt å ta hensyn til et veldig subtilt punkt i situasjonen ovenfor: sayHi-funksjonen blir engangs, for hvis vi kaller den igjen, vil PHP igjen komme over definisjonen av sayGoodbye-funksjonen, og i PHP kan du ikke gjøre det. dette - du kan ikke overstyre funksjoner. Jeg skrev om dette og hvordan jeg skal håndtere det i en tidligere artikkel.

I PHP brukes teknikkene beskrevet ovenfor svært sjelden, de kan sees oftere, for eksempel i JavaScript.

Variabelt omfang

Det er nøyaktig to omfang i PHP: global Og lokale. Hvert programmeringsspråk strukturerer forskjellig omfang. For eksempel, i C++, har selvløkker sitt eget (lokale) omfang. I PHP er dette forresten et globalt omfang. Men i dag snakker vi om funksjoner.

Funksjoner i PHP har sitt eget interne omfang (lokalt), det vil si at alle variabler inne i en funksjon er kun synlige innenfor denne funksjonen.

Så, nok en gang: alt utenfor funksjonene er det globale omfanget, alt innenfor funksjonene er det lokale omfanget. Eksempel:

Kjære eksperter, oppmerksomhet, spørsmål! Hva vil den siste instruksjonen gi? ekko $navn; ?

Som du så selv, hadde vi 2 variabler $navn, en innenfor funksjonen (lokalt omfang), den andre bare i koden (globalt omfang), den siste tilordningen til en variabel $navn var $name = "Rud Sergey"; Men siden den var inne i funksjonen ble den der. I det globale omfanget var det siste oppdraget $name = "Andrey"; som er det vi faktisk ser som et resultat.

Det vil si to identiske variabler, men i ulike omfang skjærer de seg ikke og påvirker ikke hverandre.

La meg illustrere omfanget i figuren:

Under den første traverseringen skanner tolken kort det globale omfanget, husker hvilke variabler og funksjoner som finnes, men utfører ikke koden.

Tilgang til globale variabler fra lokalt omfang

Men hva om vi fortsatt trenger å få tilgang til den samme $name-variabelen fra det globale omfanget fra en funksjon, og ikke bare få tilgang til den, men endre den? Det er 3 hovedalternativer for dette. Den første bruker et nøkkelord global:

"; global $navn; /*fra nå av mener vi den globale variabelen $name*/$name = "Rud Sergey"; ) $name = "Andrey"; si hei($navn); ekko $navn; // ?

Resultat:

Men denne metoden har en ulempe, siden vi fikk tilgang til den globale variabelen $navn vi mistet (overskrev) en lokal variabel $navn.

Andre vei er å bruke PHP superglobal matrise. PHP selv plasserer automatisk hver variabel som vi opprettet i det globale omfanget i denne matrisen. Eksempel:

$name = "Andrey"; //Samme som$GLOBALS["name"] = "Andrey";

Derfor:

"; $GLOBALS["name"] = "Rud Sergey"; ) $name = "Andrey"; si hei($navn); ekko $navn; // ?

Resultatet er det samme som å bruke nøkkelordet global:

Bare denne gangen skrev vi ikke om den lokale variabelen, det vil si variabelen $navn inne i funksjonen forblir den samme og er lik "Andrey", men ikke "Rud Sergey".

Sende argumenter ved referanse

Tredje vei– dette er overføringen av adresse ( lenker) av en variabel, ikke dens verdi. Lenker i PHP er ikke særlig vellykkede, i motsetning til andre programmeringsspråk. Jeg vil imidlertid fortelle deg det eneste riktige alternativet for å sende et argument ved å referere til en funksjon, som vanligvis støttes i PHP 5.3 og høyere. Det er andre måter å jobbe med lenker på, men de fungerte i PHP 5.2 og lavere, som et resultat bestemte PHP-utviklerne selv å forlate dem, så vi vil ikke snakke om dem.

Så, RIKTIG overføring av et argument ved referanse i PHP 5.3 og høyere gjøres som følger:

Funksjon si hei(& $navn)(

I selve funksjonsbeskrivelsen la vi til et og-tegnet (&)-ikon - dette ikonet betyr at vi ikke aksepterer verdien til variabelen, men en lenke (adresse) til denne verdien i minnet. Referanser i PHP lar deg lage to variabler som peker på samme verdi. Dette betyr at når en av disse variablene endres, endres begge, siden de refererer til samme verdi i minnet.

Og til slutt har vi:

//aksepter ikke en verdi, men en referanse til verdien echo "Hei, ".$navn."!
"; $name = "Rud Sergey"; ) $name = "Andrey"; si hei($navn); ekko $navn; // ?

Resultat:

Statiske variabler

Tenk deg følgende situasjon: vi må telle hvor mange ganger vi sa hei totalt. Her er hva vi prøver å gjøre:

"; $c++; // øke telleren med 1


Resultat:

Variabel $c husker ikke betydningen, den skapes på nytt hver gang. Vi må lage vår lokale variabel $c husket verdien etter å ha utført funksjonen, for dette bruker de et nøkkelord statisk:

// teller, gjort statisk echo "Hei, ".$navn."!
"; $c++; // øke telleren med 1 ekko "Bare sa hei". $c . " en gang.


"; ) si hei("Rud Sergey"); si hei("Andrey"); si hei("Dmitry");

Resultat:

Returverdier

Funksjoner har en så praktisk ting som å returnere verdier. Dette er når en funksjon, i stedet for å skrive ut noe på skjermen, legger alt inn i en variabel og gir den variabelen til oss. Og vi bestemmer oss allerede for hva vi skal gjøre med det. La oss for eksempel ta denne funksjonen, den kvadrerer et tall:

Resultat:

La oss gjøre det slik at i stedet for å vise det på skjermen, returnerer det utførelsesresultatet. For å gjøre dette, bruk returnøkkelordet:

Resultat:

Nå kan vi bruke dette på forskjellige måter:

//mater ut resultatet ekko "
"; $num = getSquare(5); ekko $num;

Resultat:

Vær oppmerksom på at nøkkelordet komme tilbake returnerer ikke bare en verdi, men avbryter funksjonen fullstendig, det vil si all koden som er under nøkkelordet komme tilbake vil aldri bli oppfylt. Med andre ord, retur for funksjoner fungerer også som gå i stykker for løkker:

echo "PHP vil aldri nå meg:(";) echo getSquare(5); //mater ut resultatet ekko "
"; $num = getSquare(5); // tildelte resultatet til en variabel ekko $num; // vis variabelen på skjermen

Resultat:

Det er komme tilbake– dette er også en utgang fra funksjonen. Den kan brukes uten returverdi, bare for utdataens skyld.

Rekursiv funksjon

En rekursiv funksjon er en funksjon som kaller seg selv. Rekursjon brukes ikke ofte og regnes som en ressurskrevende (langsom) operasjon. Men det hender at bruk av rekursjon er det mest åpenbare og enkle alternativet. Eksempel:

"; if($nummer< 20){ // slik at rekursjonen ikke blir uendelig countPlease(++$nummer); // countPlease-funksjonen kalte seg selv) ) tellVennligst(1);

Resultat:

Hvis du vet hvordan du gjør det uten rekursjon, er det bedre å gjøre det.

Sterk skriving i PHP (typeavgrensning)

PHP tar små skritt mot sterk skriving, så vi kan spesifisere på forhånd hvilken type en funksjon skal ta (dette kalles type-hint):

Resultat:

Fangbar fatal feil: Argument 1 sendt til countPlease() må være en matrise, heltall gitt, kalt inn /home/index.php på linje 7 og definert i /home/index.php på linje 3

Feilen forteller oss at funksjonen forventer å motta en matrise, men i stedet sender vi den et tall. Dessverre kan vi foreløpig bare spesifisere typen for (array), og med PHP 5.4 la vi også til et alternativ som anropsbar:

Ringbar sjekker om den beståtte verdien kan kalles opp som en funksjon. Callable kan enten være navnet på en funksjon spesifisert av en strengvariabel, eller et objekt og navnet på metoden som kalles. Men vi vil snakke om objekter og metoder senere (dette er en del av objektorientert programmering), men du er allerede kjent med funksjoner. Jeg kan ikke vise deg resultatet av arbeidet, siden jeg for øyeblikket har PHP 5.3, men det vil være:

Kalt getEcho-funksjonen

Bruke argumenter med variabel lengde

Og til slutt, enda en svært sjelden brukt nyanse. Tenk deg en situasjon: vi sender argumenter til en funksjon, selv om vi ikke beskrev dem i funksjonen, for eksempel:

Resultat:

Som du kan se er det ingen feil, men våre beståtte argumenter brukes ikke noe sted. Men dette betyr ikke at de er borte - de ble fortsatt sendt inn i funksjonen og vi kan bruke dem; det er innebygde PHP-funksjoner for dette:

func_num_args()- Returnerer antall argumenter som er sendt til funksjonen
func_get_arg(sekvensnummer)- Returnerer et element fra en liste med argumenter
func_get_args()- Returnerer en matrise som inneholder funksjonsargumentene

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

Resultat:

Konklusjon

Dagens artikkel er den siste om temaet funksjoner i PHP. Nå kan du være trygg på at kunnskapen din om dette emnet er fullstendig, og du kan trygt bruke funksjonene etter dine behov.

Hvis noen har et ønske om å bli bedre på det, men ikke aner hvordan det skal gjøres, vil den beste måten være å skrive ferdige (innebygde) PHP-funksjoner, for eksempel kan du skrive din egen count()-funksjon eller noe annet.

Takk alle sammen for oppmerksomheten og på gjensyn! Hvis noe ikke er klart, still gjerne spørsmålene dine i kommentarfeltet!

Denne opplæringen dekker omfanget av PHP-variabler. Forklarer forskjellen mellom lokalt og globalt omfang, viser hvordan man får tilgang til globale variabler i en funksjon, hvordan man jobber med superglobale og lager statiske variabler.

Når du begynner å lære PHP og begynner å jobbe med funksjoner og objekter, er variabelt omfang litt forvirrende. Heldigvis er PHPs regler i denne forbindelse veldig enkle å forstå (sammenlignet med andre programmeringsspråk).

Hva er omfang?

Omfanget av variabler er konteksten som variabelen ble definert innenfor og hvor den kan nås. PHP har to variable omfang:

  • Global- Variabler kan nås hvor som helst i skriptet
  • Lokalt- variabler kan bare nås i funksjonen de ble definert i

Omfanget av en variabel, og spesielt den lokale, forenkler kodeadministrasjonen betraktelig. Hvis alle variabler var globale, kunne de endres hvor som helst i skriptet. Dette ville føre til kaos og store skript, siden svært ofte forskjellige deler av skriptet bruker variabler med samme navn. Ved å begrense omfanget til den lokale konteksten, definerer du grensene for koden som kan få tilgang til en variabel, noe som gjør koden mer robust, modulær og enklere å feilsøke.

Variabler med globalt omfang kalles globalt, og variabler med lokalt omfang kalles lokale.

Her er et eksempel på hvordan globale og lokale variabler fungerer.

"; ) siHallo(); echo "Verdi av \$globalName: "$globalName"
"; ekko "\$localName verdi: "$localName"
"; ?>

Hei Harry! $globalName verdi: "Zoe" $localName verdi: ""

I dette skriptet har vi laget to variabler:

  • $globalName- Dette global variabel
  • $localName- Dette lokale en variabel som er opprettet inne i sayHello()-funksjonen.

Etter å ha opprettet variabelen og funksjonen, kaller skriptet sayHello(), som skriver ut "Hello Harry!" . Skriptet prøver deretter å sende ut verdiene til de to variablene ved å bruke ekkofunksjonen. Her er hva som skjer:

  • Fordi $globalName ble opprettet utenfor funksjonen, er den tilgjengelig hvor som helst i skriptet, så "Zoe" skrives ut.
  • $localName vil bare være tilgjengelig i sayHello()-funksjonen. Siden ekkouttrykket er utenfor funksjonen, gir ikke PHP tilgang til den lokale variabelen. I stedet forventer PHP at koden lager en ny variabel kalt $localName , som vil ha en standardverdi for den tomme strengen. det er derfor det andre kallet til ekko gir verdien "" for $localName-variabelen.

Tilgang til globale variabler i en funksjon

For å få tilgang til en global variabel ute av funksjon Bare å skrive navnet hennes er nok. Men for å få tilgang til en global variabel inne i en funksjon, må du først erklære variabelen som global i funksjonen ved å bruke det globale nøkkelordet:

Funksjon myFunction() ( global $globalVariable; // Få tilgang til den globale variabelen $globalVariable )

Hvis du ikke gjør dette, antar PHP at du oppretter eller bruker en lokal variabel.

Her er et eksempelskript som bruker en global variabel i en funksjon:

"; global $globalName; ekko "Hei $globalName!
"; ) si Hei(); ?>

Når det kjøres, vil skriptet sende ut:

Hei Harry! Hei Zoya!

sayHello()-funksjonen bruker det globale nøkkelordet for å erklære $globalName-variabelen til å være global. Hun kan da få tilgang til variabelen og gi dens verdi ("Zoe").

Hva er superglobale?

PHP har et spesielt sett med forhåndsdefinerte globale arrays som inneholder forskjellig informasjon. Slike arrays kalles superglobale, siden de er tilgjengelige fra hvor som helst i skriptet, inkludert internt funksjonsområde, og ikke trenger å defineres med det globale nøkkelordet.

Her er en liste over superglobals tilgjengelig i PHP versjon 5.3:

  • $GLOBALS - liste over alle globale variabler i skriptet (unntatt superglobals)
  • $_GET - inneholder en liste over alle skjemafelt som sendes inn av nettleseren ved hjelp av en GET-forespørsel
  • $_POST - inneholder en liste over alle skjemafelt sendt av nettleseren ved hjelp av en POST-forespørsel
  • $_COOKIE - inneholder en liste over alle informasjonskapsler sendt av nettleseren
  • $_REQUEST - inneholder alle nøkkel-/verdikombinasjoner som finnes i matrisene $_GET, $_POST, $_COOKIE
  • $_FILES - inneholder en liste over alle filer lastet ned av nettleseren
  • $_SESSION - lar deg lagre og bruke øktvariabler for gjeldende nettleser
  • $_SERVER - inneholder informasjon om serveren, for eksempel filnavnet på skriptet som kjøres og IP-adressen til nettleseren.
  • $_ENV - inneholder en liste over miljøvariabler sendt til PHP, for eksempel CGI-variabler.
For eksempel kan du bruke $_GET for å få verdiene til variabler innesluttet i et skripts forespørsels-URL-streng, og vise dem på siden:

Hvis du kjører skriptet ovenfor ved å bruke URL-adressen http://www.example.com/script.php?dittnavn=Fred, vil det sende ut:

Hei Fred!

Advarsel! I et ekte skript bør slik dataoverføring aldri brukes på grunn av svak sikkerhet. Du bør alltid validere eller filtrere data.

$GLOBALS superglobal er veldig praktisk å bruke fordi den lar deg organisere tilgang til globale variabler i en funksjon uten behov for det globale nøkkelordet. For eksempel:

"; ) sayHello(); // Skriver ut "Hei, Zoya!" ?>

Statiske variabler: de er rundt et sted

Når du oppretter en lokal variabel inne i en funksjon, eksisterer den bare mens funksjonen kjører. Når funksjonen er fullført, forsvinner den lokale variabelen. Når funksjonen kalles opp igjen, opprettes en ny lokal variabel.

I de fleste tilfeller fungerer dette utmerket. Dermed er funksjonene selvstendige og fungerer alltid likt hver gang de blir anropt.

Imidlertid er det situasjoner der det ville være praktisk å lage en lokal variabel som "husker" verdien mellom funksjonskall. En slik variabel kalles statisk.

For å lage en statisk variabel i en funksjon, må du bruke det statiske nøkkelordet før variabelnavnet og sørge for å gi det en startverdi. For eksempel:

Funksjon myFunction() ( statisk $myVariable = 0; )

La oss vurdere en situasjon når det er praktisk å bruke en statisk variabel. La oss si at du oppretter en funksjon som, når den kalles, oppretter en widget og viser antall widgets som allerede er opprettet. Du kan prøve å skrive kode som dette ved å bruke en lokal variabel:


"; echo createWidget(). " har vi allerede opprettet.
"; echo createWidget() . " har vi allerede opprettet.>
"; ?>

Men siden $numWidgets-variabelen opprettes hver gang funksjonen kalles, vil vi få følgende resultat:

Vi lager noen widgets... Vi har allerede opprettet 1. Vi har allerede opprettet 1. Vi har allerede opprettet 1.

Men ved å bruke en statisk variabel kan vi lagre verdien fra ett funksjonskall til et annet:

"; echo createWidget(). " har vi allerede opprettet.
"; echo createWidget(). " har vi allerede opprettet.
"; echo createWidget(). " >vi har allerede opprettet.
"; ?>

Nå vil skriptet produsere det forventede resultatet:

Vi lager noen widgets... Vi har allerede opprettet 1. Vi har allerede opprettet 2. Vi har allerede opprettet 3.

Selv om en statisk variabel beholder sin verdi mellom funksjonskall, er den bare gyldig mens skriptet kjører. Når skriptet er fullført, blir alle statiske variabler ødelagt, det samme er lokale og globale variabler.

Det er alt! Vennligst se din PHP-dokumentasjon ofte.

Det å merke seg her er at kodeelementet du presenterte bør betraktes som dårlig design og programmeringsstil, fordi den behandler den inkluderte filen som et umiddelbart kjørbart sett med operasjoner.

Den mest korrekte tilnærmingen vil være å sette settet med operasjoner som funksjoner/klasser med sitt eget navn i en fil, inkludere filen (uten noen retursetning utenfor funksjonene), og deretter kalle funksjonen åpenbart med det nødvendige settet med argumenter.

Så hva er problemet?

Alt er ekstremt enkelt, du gjør det inkludere inne i en metode metode, som betyr at variablene som er spesifisert i den inkluderte filen, initialiseres i omfanget av metoden metode. Derfor er variabelen $lang er ikke global og er begrenset av metodens synlighet, og du får tilgang til en global variabel, så når du bruker modifikatoren global det vil være lik null.

Hvis du inkluderer i det globale omfanget, vil lang-variabelen bli offentlig (global) og bruken av den blir mulig. Dette er enkelt å sjekke; i den inkluderte filen, før du begynner å definere en variabel, er det bare å skrive global $variabel.

Eksempel:

inkluderer "fil1.php"; funksjon include2() (inkluder "fil2.php"; )
  • file1.php er definert i globalt omfang.
  • file2.php er definert i det lokale omfanget av include2-funksjonen.

Tilnærmingen med globale variabler og slike inkluderer er en krykke som vil gi deg problemer i fremtiden. Funksjoner må være eksplisitt definert, ha et unikt navn og utføres på forespørsel.

Hvorfor er tilnærmingen med globale variabler dårlig?

Poenget er at globale variabler er synlige fra overalt, globalt. Dette er praktisk: det er ingen begrensninger. På den annen side blir det helt umulig å spore hvem som endrer dataene. Ukontrollerte endringer er det første man vanligvis tenker på når man spør hvorfor globale variabler er dårlige.

La oss si at du har en funksjon hvis resultat avhenger av en global variabel. Du kaller det, kaller det, men etter 10 minutter begynner funksjonen å returnere feil resultater. Hva har skjedd? Tross alt, sender du det samme settet med parametere til det som input? Hmm, noen endret verdien på en global variabel... Hvem kan det være? Ja, hvem som helst - tross alt er en global variabel tilgjengelig for alle..

Den beste oppskriften for å designe subrutiner er: gjør at resultatet av funksjonen din bare avhenger av argumentene. Dette er et ideal å strebe etter.

Ikke bruk globale variabler i prosjektet ditt unødvendig, dra nytte av alle funksjonene til lokalt omfang ved å sende parametere til funksjonsargumenter, og koden vil være lettere å skrive, vedlikeholde og teste.

Vet du hva som er det beste prefikset for globale variabler?

Variabler definert innenfor en subrutine (brukerdefinert funksjon). De er bare tilgjengelige innenfor funksjonen de er definert i.

For PHP er alle variabler som er deklarert og brukt i en funksjon lokale for funksjonen som standard. Det vil si at det som standard ikke er mulig å endre verdien til en global variabel i kroppen til en funksjon.

Hvis du i brødteksten til en brukerdefinert funksjon bruker en variabel med et navn som er identisk med navnet på en global variabel (plassert utenfor den brukerdefinerte funksjonen), vil ikke denne lokale variabelen ha noen relasjon til den globale variabelen. I denne situasjonen vil en lokal variabel med et navn som er identisk med navnet på den globale variabelen bli opprettet i den brukerdefinerte funksjonen, men denne lokale variabelen vil bare være tilgjengelig innenfor denne brukerdefinerte funksjonen.

La oss forklare dette faktum med et spesifikt eksempel:

$a = 100 ;

funksjon funksjon() (
$a = 70 ;
ekko "

$a

" ;
}
funksjon();
ekko "

$a

" ;
?>

Skriptet vil først skrive ut 70 og deretter 100:

70
100

For å bli kvitt denne ulempen er det en spesiell instruksjon i PHP global, slik at en brukerdefinert funksjon kan jobbe med globale variabler. La oss se på dette prinsippet ved å bruke spesifikke eksempler:

$a = 1 ;
$b = 2 ;

Funksjon Sum()
{
global $a, $b;

$b = $a + $b ;
}

Sum();
ekko $b ;
?>

Skriptet ovenfor vil gi ut " 3 ". Etter å ha definert $a Og $b inne i funksjonen som global alle referanser til noen av disse variablene vil peke til deres globale versjon. Det er ingen grense for antall globale variabler som kan håndteres av brukerdefinerte funksjoner.

Den andre måten å få tilgang til globale omfangsvariabler på er å bruke en spesiell PHP-definert matrise $GLOBALS. Det forrige eksemplet kan skrives om slik:

Bruk av $GLOBALS i stedet for global:

$a = 1 ;
$b = 2 ;

Funksjon Sum()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}

Sum();
ekko $b ;
?>

$GLOBALS er en assosiativ matrise hvis nøkkel er navnet og verdien er innholdet i den globale variabelen. Legg merke til at $GLOBALS eksisterer uansett omfang, dette er fordi dette er en matrise. Nedenfor er et eksempel som viser evnene til superglobaler:

funksjon test_global()
{
// De fleste forhåndsdefinerte variablene er det ikke
// "super" og for å være tilgjengelig i nærområdet
// funksjonssynlighet krever at "global" spesifiseres.
global $HTTP_POST_VARS ;

Ekko $HTTP_POST_VARS["navn"];

// Superglobals er tilgjengelige i alle omfang
// synlighet og krever ikke at "global" spesifiseres.
// Superglobals tilgjengelig siden PHP 4.1.0
echo $_POST ["navn" ];
}
?>