Globālie mainīgie PHP. Php mainīgā redzamība joma mainīgā redzamība funkcijās

Pēdējā atjaunināšana: 1.11.2015

Izmantojot mainīgos un funkcijas, ņemiet vērā mainīgo apjomu. Darbības joma norāda darbības jomu un konkrētā mainīgā pieejamību.

Vietējie mainīgie

Vietējie mainīgie tiek izveidoti funkcijas iekšpusē. Šādiem mainīgajiem var piekļūt tikai no noteiktās funkcijas. Piemēram:

Šajā gadījumā funkcija get() definē lokālo mainīgo $result. Un no vispārējā konteksta mēs tam nevaram piekļūt, tas ir, ierakstiet $a = $rezults; Tas nav iespējams, jo mainīgā $result darbības jomu ierobežo funkcija get(). Ārpus šīs funkcijas mainīgais $result nepastāv.

Tas pats attiecas uz funkciju parametriem: ārpus funkcijas parametri $lowlimit un $highlimit arī nepastāv.

Parasti lokālie mainīgie saglabā dažus aprēķinu starprezultātus, kā parādīts iepriekš minētajā piemērā.

Statiskie mainīgie

Statiskie mainīgie ir līdzīgi vietējiem mainīgajiem. Tie atšķiras ar to, ka pēc funkcijas pabeigšanas to vērtība tiek saglabāta. Katru reizi, kad funkcija tiek izsaukta, tā izmanto iepriekš saglabāto vērtību. Piemēram:

Lai norādītu, ka mainīgais būs statisks, tam tiek pievienots atslēgvārds static. Trīs reizes pēc kārtas izsaucot getCounter(), mainīgais $counter tiks palielināts par vienu.

Ja mainīgais $counter būtu parasts nestatisks mainīgais, tad getCounter() drukātu 1 katru reizi, kad tas tiktu izsaukts.

Parasti statiskos mainīgos izmanto, lai izveidotu dažādus skaitītājus, kā parādīts iepriekš minētajā piemērā.

Globālie mainīgie

Dažreiz vēlaties, lai mainīgais būtu pieejams visur, visā pasaulē. Šādi mainīgie var saglabāt dažus visai programmai kopīgus datus. Lai definētu globālos mainīgos, izmantojiet globālo atslēgvārdu:1

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

Pēc funkcijas getGlobal() izsaukšanas mainīgajam $gvar var piekļūt no jebkuras programmas daļas.

Mainīgs apjoms ir konteksts, kurā šis mainīgais ir definēts. Lielākajai daļai PHP mainīgo ir viena darbības joma. Šī vienotā darbības joma (saukta arī par globālo tvērumu) attiecas arī uz iekļautajiem failiem:

Šajā piemērā mainīgais $a būs pieejams arī iekļautajā skriptā - main.inc .

Vietējie mainīgie

Pielāgotas funkcijas definīcija norāda lokālais apjoms mainīgajam, t.i. Jebkurš mainīgais, ko izmanto funkcijā, pēc noklusējuma ir ierobežots līdz funkcijas lokālajam tvērumam (pieejams tikai tajā funkcijā, kurā tas ir definēts). Kā tas darbojas: lai atdalītu mainīgos, ko izmanto vispārējā kodā no mainīgajiem, ko izmanto funkcijās, PHP nodrošina atsevišķu mainīgo krātuvi katrā funkcijā. Šis krātuves vietas sadalījums nozīmē, ka darbības joma, tas ir, apgabals, kurā ir pieejama mainīgā vērtība, ir funkcijas vietējā krātuve.

Tālāk sniegtais piemērs skaidri parāda, ka mainīgais, kas deklarēts ārpus funkcijas, funkcijā nemainās. Lai gan jums nevajadzētu mēģināt saprast, kā funkcija darbojas, galvenais ir tas, ka tai ir savs unikāls mainīgo lielumu kopums:

30 ?>

Šī fragmenta izpildes rezultātā tiks parādīts: 30.

Funkcijā birth() mainīgais $age ir iestatīts uz 1, taču tas nav tas pats mainīgais, kas tika definēts globālajā tvērumā. Tāpēc, drukājot mainīgā $age vērtību, tiek izdrukāta sākotnējā vērtība 30. Ir vērts atzīmēt, ka lokālie mainīgie tiek izveidoti funkcijas izsaukšanas brīdī un tiek dzēsti pēc funkcijas pabeigšanas.

Ja tiešām vēlaties lasīt vai mainīt globālā mainīgā vērtību (kā tiek saukti mainīgie, kas tiek izmantoti globālajā tvērumā), nevis lokālā funkcijā birth(), tas ir jādeklarē kā globāls funkcijas definīcijā.

Piezīme: Ir aktivizēta vietnes adaptīvā versija, kas automātiski pielāgojas jūsu pārlūkprogrammas mazajam izmēram un paslēpj dažas vietnes detaļas, lai atvieglotu lasīšanu. Patīkamu skatīšanos!

Sveiki, dārgie emuāra lasītāji Vietne ieslēgts! Mēs uzzinājām, ka PHP ir funkcija, mēs uzzinājām, kā izveidot savas funkcijas, nodot tām argumentus un izsaukt tās izpildei. Turpinot tēmu par PHP funkcijām, jāuzsver šādas lietas:

  • Funkcijas iekšpusē varat izmantot jebkuru PHP kodu (ciklus, nosacījumus, jebkuras darbības), ieskaitot citas funkcijas (gan iebūvētas, gan pielāgotas);
  • Funkcijas nosaukumam jāsākas ar latīņu burtu vai pasvītru, kam seko jebkurš latīņu burtu, ciparu vai pasvītru skaits;
  • Visām funkcijām ir globāls apjoms, kas nozīmē, ka jebkuru funkciju var izsaukt jebkurā vietā, pat ja šī funkcija ir definēta citā;
  • PHP neatbalsta funkciju pārslodzi, nav arī iespējas pārdefinēt (mainīt, pievienot) vai dzēst izveidoto funkciju;
  • Funkcijas nav jādefinē pirms to izmantošanas. Tas ir, ja vispirms izsaucat funkciju un tikai pēc tam aprakstāt to tālāk esošajā kodā, tas neietekmēs veiktspēju un neizraisīs kļūdas.

Nosacījuma funkcijas

Mēs varam izveidot (definēt, aprakstīt) funkciju atkarībā no nosacījuma. Piemēram:

//izsauca funkciju sayHi, to var izsaukt jebkur /*šeit nevar izsaukt funkciju sayGoodbye, jo mēs vēl neesam pārbaudījuši nosacījumu un neesam iegājuši if konstrukcijā*/ if($apply)( funkcija say Goodbye())( echo "Čau visiem!
"; } } /*tagad varam piezvanīt uz redzēšanos*/
"; }

Rezultāts:

Un apskatiet šo piemēru:

/*un tas notiks, ja piezvanīsi ardievu šeit*/ saki ardievas(); if($apply)( funkcija say Goodbye())( echo "Čau visiem!
"; ) ) function sayHi())( echo "Sveiki visiem!
"; }

Rezultāts:

Patiesībā, cik esmu strādājis, neko tādu nekur neesmu redzējis, bet jāpatur prātā visas valodas iespējas.

Ligzdotas funkcijas

Ligzdota funkcija ir funkcija, kas deklarēta citā funkcijā. Piemērs:

/*Šeit nevar izsaukt sayGoodbye, jo tas parādīsies tikai pēc funkcijas sayHi izsaukšanas*/ saki sveiks(); /*izsaukt funkciju sayHi, to var izsaukt jebkur*/ /*Tagad varam piezvanīt uz redzēšanos*/ saki ardievas(); funkcija sayHi())( echo "Sveiki visiem!
"; funkcija sayGoodbye())( echo "Čau visiem!
"; } }

Atkal pirmajā šķērsošanas reizē PHP tulks atzīmē sevi, ka ir atradis funkcijas sayHi aprakstu, bet neieiet tās korpusā, tas redz tikai nosaukumu, un, tā kā tulks neieiet sayHi korpusā, tad tam nav ne jausmas, ko mēs definējam citā funkcijā – atvadieties.

Tad sāk darboties kods, mēs izsaucam sayHi, PHP tulkam jāieiet funkcijas sayHi pamattekstā, lai to izpildītu un tur tas nejauši atrod citas funkcijas aprakstu - sayGoodbye, pēc kura sayGoodbye var izsaukt jebkur, cik reizes kā tev patīk.

Bet ir vērts pievērst uzmanību ļoti smalkam punktam iepriekš minētajā situācijā: funkcija sayHi kļūst vienreizēja, jo, ja mēs to izsaucam vēlreiz, PHP atkal saskarsies ar funkcijas sayGoodbye definīciju, un PHP to nevar darīt. tas - jūs nevarat ignorēt funkcijas. Par to un kā ar to rīkoties, es rakstīju iepriekšējā rakstā.

PHP programmā iepriekš aprakstītās metodes tiek izmantotas ļoti reti, tās var redzēt biežāk, piemēram, JavaScript.

Mainīgais tvērums

PHP ir tieši divi tvērumi: globāli Un vietējā. Katra programmēšanas valoda darbības jomas strukturē atšķirīgi. Piemēram, C++ pat cilpām ir savs (lokālais) darbības joma. Starp citu, PHP tas ir globāls mērogs. Bet šodien mēs runājam par funkcijām.

PHP funkcijām ir sava iekšējā joma (lokālā), tas ir, visi funkcijas iekšienē esošie mainīgie ir redzami tikai šajā funkcijā.

Tātad vēlreiz: viss ārpus funkcijām ir globālais tvērums, viss, kas atrodas funkcijās, ir lokāls. Piemērs:

Cienījamie eksperti, uzmanību, jautājums! Kāda būs pēdējā instrukcija? atbalss $nosaukums; ?

Kā jūs pats redzējāt, mums bija 2 mainīgie $name, viens funkcijā (lokālais tvērums), otrs tikai kodā (globālais tvērums), pēdējā piešķiršana mainīgajam $name bija $name = "Ruds Sergejs"; Bet, tā kā tas bija funkcijā, tas tur arī palika. Pasaules mērogā pēdējais uzdevums bija $vārds = "Andrijs"; ko mēs patiesībā redzam kā rezultātu.

Tas ir, divi identiski mainīgie, bet dažādos tvērumos tie nekrustojas un neietekmē viens otru.

Ļaujiet man ilustrēt darbības jomu attēlā:

Pirmās šķērsošanas laikā tulks īsi skenē globālo tvērumu, atceras, kādi ir mainīgie un funkcijas, bet neizpilda kodu.

Piekļuve globālajiem mainīgajiem no lokālā tvēruma

Bet ko darīt, ja mums joprojām ir jāpiekļūst tam pašam mainīgajam $name no globālās darbības jomas no funkcijas, nevis tikai tam jāpiekļūst, bet arī jāmaina? Šim nolūkam ir 3 galvenās iespējas. Pirmais izmanto atslēgvārdu globāli:

"; globālais $nosaukums; /*no šī brīža mēs domājam globālo mainīgo $name*/$name = "Ruds Sergejs"; ) $vārds = "Andrijs"; sayHi($vārds); atbalss $nosaukums; //?

Rezultāts:

Bet šai metodei ir trūkums, jo mēs piekļuvām globālajam mainīgajam $name mēs pazaudējām (pārrakstījām) lokālo mainīgo $name.

Otrais veids ir izmantot PHP superglobālais masīvs. Pati PHP šajā masīvā automātiski ievieto katru mainīgo, ko mēs izveidojām globālajā tvērumā. Piemērs:

$vārds = "Andrijs"; //Tāds pats kā$GLOBALS["vārds"] = "Andrijs";

Tātad:

"; $GLOBALS["name"] = "Rud Sergejs"; ) $name = "Andrijs"; sayHi($name); echo $name; // ?

Rezultāts ir tāds pats kā izmantojot atslēgvārdu globāli:

Tikai šoreiz mēs nepārrakstījām lokālo mainīgo, tas ir, mainīgo $name iekšā funkcija paliek nemainīga un ir vienāda "Andrijs", bet ne "Ruds Sergejs".

Argumentu nodošana pēc atsauces

Trešais ceļš– šī ir adreses pārsūtīšana ( saites) mainīgā lieluma, nevis tā vērtības. Saites PHP nav pārāk veiksmīgas, atšķirībā no citām programmēšanas valodām. Tomēr es jums pateikšu vienīgo pareizo opciju argumenta nodošanai, atsaucoties uz funkciju, kas parasti tiek atbalstīta PHP 5.3 un jaunākās versijās. Ir arī citi veidi, kā strādāt ar saitēm, taču tie strādāja PHP 5.2 un jaunākās versijās, kā rezultātā paši PHP izstrādātāji nolēma no tiem atteikties, tāpēc mēs par tiem nerunāsim.

Tātad PAREIZA argumenta nodošana ar atsauci PHP 5.3 un jaunākās versijās tiek veikta šādi:

Funkcija sayHi(& $name)(

Pašā funkcijas aprakstā mēs pievienojām simbolu & — šī ikona nozīmē, ka mēs nepieņemam mainīgā lieluma vērtību, bet gan saiti (adresi) uz šo vērtību atmiņā. Atsauces PHP ļauj izveidot divus mainīgos, kas norāda uz vienu un to pašu vērtību. Tas nozīmē, ka, mainoties vienam no šiem mainīgajiem, mainās abi, jo tie attiecas uz vienu un to pašu vērtību atmiņā.

Un galu galā mums ir:

//pieņemt nevis vērtību, bet atsauci uz vērtību echo "Sveiks, ".$vārds."!
"; $name = "Rud Sergejs"; ) $name = "Andrijs"; sayHi($name); echo $name; // ?

Rezultāts:

Statiskie mainīgie

Iedomājieties šādu situāciju: mums jāsaskaita, cik reižu mēs kopumā sveicinājāmies. Lūk, ko mēs cenšamies darīt:

"; $c++; // palielināt skaitītāju par 1


Rezultāts:

Mainīgs $c neatceras savu nozīmi, tas katru reizi tiek radīts no jauna. Mums ir jāpadara mūsu lokālais mainīgais $c atcerējās tās vērtību pēc funkcijas izpildes, tāpēc viņi izmanto atslēgvārdu statisks:

// skaitītājs, padarīts statisks echo "Sveiks, ".$vārds."!
"; $c++; // palielināt skaitītāju par 1 atbalss "Tikko sveiki" . $c . "vienu reizi.


"; ) sayHi("Rud Sergejs"); sayHi("Andrey"); sayHi ("Dmitrijs");

Rezultāts:

Atgriežamās vērtības

Funkcijām ir tāda ērta lieta kā vērtību atgriešana. Tas ir tad, kad funkcija tā vietā, lai kaut ko drukātu uz ekrāna, visu ievieto mainīgajā un piešķir mums šo mainīgo. Un mēs jau lemjam, ko ar to darīt. Piemēram, ņemsim šo funkciju, tā ir skaitļa kvadrātā:

Rezultāts:

Padarīsim tā, lai tā vietā, lai parādītu to ekrānā, tas atgriež izpildes rezultātu. Lai to izdarītu, izmantojiet atgriešanas atslēgvārdu:

Rezultāts:

Tagad mēs to varam izmantot dažādos veidos:

//izvada rezultātu atbalss"
"; $num = getSquare(5); echo $num;

Rezultāts:

Lūdzu, ņemiet vērā, ka atslēgvārds atgriezties ne tikai atgriež vērtību, bet arī pilnībā pārtrauc funkciju, tas ir, visu kodu, kas atrodas zem atslēgvārda atgriezties nekad nepiepildīsies. Citiem vārdiem sakot, funkciju atdeve darbojas arī līdzīgi pārtraukums cilpām:

echo "PHP mani nekad nesasniegs:(";) echo getSquare(5); //izvada rezultātu atbalss"
"; $num = getSquare(5); // piešķīra rezultātu mainīgajam atbalss $num; // parāda mainīgo ekrānā

Rezultāts:

Tas ir atgriezties– šī ir arī izeja no funkcijas. To var izmantot bez atgriešanas vērtības, tikai izvades labad.

Rekursīvā funkcija

Rekursīva funkcija ir funkcija, kas izsauc sevi. Rekursiju neizmanto bieži un uzskata par resursietilpīgu (lēnu) darbību. Bet gadās, ka rekursijas izmantošana ir visredzamākā un vienkāršākā iespēja. Piemērs:

"; if($skaitlis< 20){ // lai rekursija nekļūtu bezgalīga countLūdzu(++$skaitlis); // funkcija countPlease izsauca sevi) ) skaitsLūdzu(1);

Rezultāts:

Ja jūs zināt, kā iztikt bez rekursijas, tad labāk to darīt.

Spēcīga rakstīšana PHP (tipa precizēšana)

PHP veic nelielus soļus pretī spēcīgai rakstīšanai, tāpēc mēs varam iepriekš norādīt, kāda veida funkcijai ir jābūt (to sauc tipa mājiens):

Rezultāts:

Notverama fatāla kļūda: 1. argumentam, kas nodots skaitīšanai, lūdzu, ir jābūt masīvam, norādītam veselam skaitlim, kas tiek izsaukts /home/index.php 7. rindiņā un definēts /home/index.php 3. rindiņā.

Kļūda norāda, ka funkcija paredz saņemt masīvu, bet tā vietā mēs tai nododam skaitli. Diemžēl pagaidām varam norādīt tikai veidu priekš (masīvs), un ar PHP 5.4 pievienojām arī tādu opciju kā izsaucams:

Sazvanāms pārbauda, ​​vai nodoto vērtību var izsaukt kā funkciju. Izsaucams var būt vai nu funkcijas nosaukums, ko nosaka virknes mainīgais, vai arī objekts un izsaucamās metodes nosaukums. Bet par objektiem un metodēm mēs runāsim vēlāk (šī ir objektorientētās programmēšanas sadaļa), taču jūs jau esat iepazinušies ar funkcijām. Es nevaru jums parādīt darba rezultātu, jo man šobrīd ir PHP 5.3, bet tas būtu:

To sauc par getEcho funkciju

Mainīga garuma argumentu izmantošana

Un visbeidzot vēl viena ļoti reti izmantota nianse. Iedomājieties situāciju: mēs nododam argumentus funkcijai, lai gan mēs tos neaprakstījām funkcijā, piemēram:

Rezultāts:

Kā redzat, kļūdu nav, bet mūsu nodotie argumenti nekur netiek izmantoti. Bet tas nenozīmē, ka tie ir pazuduši - tie joprojām tika nodoti funkcijai, un mēs tos varam izmantot; šim nolūkam ir iebūvētas PHP funkcijas:

func_num_args()- Atgriež funkcijai nodoto argumentu skaitu
func_get_arg(secības numurs)- atgriež elementu no argumentu saraksta
func_get_args()- Atgriež masīvu, kurā ir funkcijas argumenti

"; echo func_get_arg(0) ; ) $vecums = 22; getEcho("Ruds Sergejs", $vecums);

Rezultāts:

Secinājums

Šodienas raksts ir pēdējais par PHP funkciju tēmu. Tagad varat būt pārliecināts par savu zināšanu pilnīgumu par šo tēmu un droši izmantot funkcijas savām vajadzībām.

Ja kādam ir vēlme kļūt labākam, bet nav ne jausmas, kā to izdarīt, vislabākais veids būtu uzrakstīt gatavas (iebūvētas) PHP funkcijas, piemēram, vari uzrakstīt savu count() funkciju. vai jebkuru citu.

Paldies visiem par uzmanību un tiekamies atkal! Ja kaut kas nav skaidrs, droši uzdodiet savus jautājumus komentāros!

Mainīgā lieluma apjoms ir konteksts, kurā mainīgais ir definēts. Vairumā gadījumu visiem PHP mainīgajiem ir tikai viena darbības joma. Šī vienotā darbības joma attiecas arī uz iekļautajiem un nepieciešamajiem failiem. Piemēram:

$a = 1;
iekļaut "b.inc" ;
?>

Šeit mainīgais $a būs pieejams iekļautajā b.inc skriptā. Tomēr lietotāja definētas funkcijas definīcija (pamatteksts) norāda šīs funkcijas lokālo darbības jomu. Jebkurš funkcijā izmantotais mainīgais pēc noklusējuma ir ierobežots līdz funkcijas lokālajam tvērumam. Piemēram:

$a = 1; /* globālā darbības joma */

Funkciju tests ()
{
atbalss $a ; /* atsauce uz lokālās darbības jomas mainīgo */
}

Pārbaude();
?>

Šis skripts neģenerēs nekādu izvadi, jo atbalss paziņojums norāda uz mainīgā $a lokālo versiju un tam nav piešķirta vērtība šajā tvērumā. Iespējams, esat pamanījuši, ka tas nedaudz atšķiras no C, jo globālie mainīgie C ir automātiski pieejami funkcijām, ja vien tos nav pārrakstījusi vietējā definīcija. Tas var radīt dažas problēmas, jo cilvēki var nejauši mainīt globālo mainīgo. PHP, ja funkcijā ir jāizmanto globālais mainīgais, tas funkcijas definīcijā ir jādeklarē kā globāls.

Atslēgvārds globāli

Vispirms lietošanas piemērs globāli:

1. piemērs, lietojums globāli

$a = 1;
$b = 2;

funkcija Sum()
{
globālie $a, $b;

$b = $a + $b ;
}

Summa();
atbalss $b ;
?>

Tiks izvadīts iepriekš minētais skripts 3 . Kad $a un $b funkcijā ir definēti kā globāli, visas atsauces uz jebkuru no šiem mainīgajiem norādīs uz to globālo versiju. Globālo mainīgo skaits, ko funkcija var apstrādāt, nav ierobežots.

Otrs veids, kā piekļūt globālajiem tvēruma mainīgajiem, ir izmantot īpašu PHP definētu masīvu $GLOBALS. Iepriekšējo piemēru varētu pārrakstīt šādi:

$GLOBALS ir asociatīvs masīvs, kura atslēga ir nosaukums un vērtība ir globālā mainīgā saturs. Ņemiet vērā, ka $GLOBALS pastāv jebkurā tvērumā, jo $GLOBALS ir superglobāls. Zemāk ir piemērs, kas parāda superglobāļu iespējas:

3. piemērs Superglobāļi un darbības joma

funkcija test_global()
{
// Lielākā daļa iepriekš definēto mainīgo nav
// "super" un jābūt pieejamam vietējā teritorijā
// redzamība, funkcijām ir jānorāda "globāls".
globālā $HTTP_POST_VARS ;

Atbalss $HTTP_POST_VARS["nosaukums"];

// Superglobāļi ir pieejami jebkurā apjomā
// redzamība un nav jānorāda "globāls".
// Superglobals ir pieejams kopš PHP 4.1.0 un
// HTTP_POST_VARS izmantošana ir novecojusi.
echo $_POST ["vārds"];
}
?>

komentēt:

Atslēgvārdu lietojums globāliārpus funkcijas nav kļūda. To var izmantot failā, kas ir iekļauts funkcijā.

Izmantojot statisko ( statisks) mainīgie

Vēl viena svarīga mainīgā apjoma iezīme ir statisks mainīgs. Statiskais mainīgais pastāv tikai funkcijas lokālajā tvērumā, bet nezaudē savu vērtību, kad programmas izpilde atstāj šo tvērumu. Apsveriet šādu piemēru:

4. piemērs, kas parāda nepieciešamību pēc statiskiem mainīgajiem

funkciju tests ()
{
$a = 0;
atbalss $a ;
$a++;
}
?>

Šī funkcija ir diezgan bezjēdzīga, jo katru reizi, kad tā tiek izsaukta, tā iestata $a uz 0 un izejas 0 . Mainīgā $a ++ pieaugumam šeit nav nozīmes, jo mainīgais $a pazūd, kad funkcija iziet. Lai uzrakstītu noderīgu skaitīšanas funkciju, kas nezaudē pašreizējo skaitītāja vērtību, mainīgais $a tiek deklarēts kā statisks:

5. piemērs Statisko mainīgo izmantošanas piemērs

funkciju tests ()
{
statiskā $a = 0 ;
atbalss $a ;
$a++;
}
?>

Tagad $a tiks inicializēts tikai pirmajā funkcijas izsaukumā un katrā funkcijas izsaukumā pārbaude() izdrukās $a vērtību un palielinās to.

Statiskie mainīgie ļauj arī strādāt ar rekursīvām funkcijām. Rekursīva funkcija ir funkcija, kas izsauc sevi. Rakstot rekursīvu funkciju, jums jābūt uzmanīgiem, jo ​​pastāv iespēja rekursiju padarīt bezgalīgu. Jums ir jānodrošina, lai būtu atbilstošs veids, kā pārtraukt rekursiju. Tālāk norādītā vienkāršā funkcija rekursīvi saskaita līdz 10, izmantojot statisko mainīgo $count, lai noteiktu, kad apstāties:

komentēt:

Statiskos mainīgos var deklarēt, kā parādīts iepriekšējā piemērā. Mēģinot piešķirt vērtības šiem mainīgajiem, kas ir izteiksmju rezultāts, radīsies apstrādes kļūda.

7. piemērs Statisko mainīgo deklarēšana

funkcija foo ()(
statisks $int = 0 ; // pa labi
statiskā $int = 1 + 2 ; // nepareizi (jo tā ir izteiksme)
statisks $int = sqrt(121); // nepareizi (jo arī šī ir izteiksme)

$int++;
atbalss $int ;
}
?>

komentēt:

Statiskās deklarācijas tiek novērtētas skripta kompilācijas laikā.

Saites ar globālo ( globāli) un statisks ( statisks) mainīgie

Zend Engine 1, kas darbina PHP 4, statiskos un globālos mainīgo modifikatorus uzskata par atsaucēm. Piemēram, reāls globālais mainīgais, kas iegults funkcijas darbības jomā, norādot atslēgvārdu globāli, faktiski rada atsauci uz globālo mainīgo. Tas var izraisīt neparedzētu rīcību, kā parādīts šajā piemērā:

funkcija test_global_ref() (
globālais $obj ;
$obj = &new stdclass ;
}

funkcija test_global_noref() (
globālais $obj ;
$obj = new stdclass ;
}

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

Šī piemēra izpildes rezultāts: get_instance_noref () (
statisks $obj ;

Atbalss "Statisks objekts:";
var_dump($obj);
if (!isset($obj )) (
// Objekta piešķiršana statiskam mainīgajam
$obj = new stdclass ;
}
$obj -> īpašums++;
atgriezties $obj ;
}

$obj1 = get_instance_ref();
$joprojām_obj1 = get_instance_ref();
atbalss "\n" ;
$obj2 = get_instance_noref();
$joprojām_obj2 = get_instance_noref();
?>

Šī piemēra izpildes rezultāts:

Statisks objekts: NULL
Statisks objekts: NULL

Statisks objekts: NULL
Statisks objekts: objekts(stdClass)(1) (
["īpašums"]=>
int(1)
}

Šis piemērs parāda, ka, piešķirot atsauci statiskam mainīgajam, tā nenotiek neaizmirstams kad izsaucat funkciju &get_instance_ref() otro reizi.

Lai izveidotu pilnvērtīgu vietni ar plašu funkciju klāstu, ir jāzina daudz. Tomēr PHP var piešķirt vietnei patiesu unikalitāti. Globālais mainīgais šajā programmēšanas valodā netiek bieži izmantots, taču dažreiz ir ļoti noderīgi zināt, kā tas darbojas.


Šajā rakstā mēs pētīsim, kas tieši ir globālais mainīgais un kā tas darbojas.

Globālais mainīgais: darbības joma

Kontekstu, kurā mainīgais tiek definēts, sauc par tā darbības jomu. Parasti mainīgajiem ir tikai viena darbības joma. Kad globālie mainīgie PHP tiek ielādēti no citiem failiem, tos var pieprasīt vai iekļaut. Pēc noklusējuma tie ir ierobežoti ar funkcijas lokālo darbības jomu. Kā jūs varat padarīt mainīgo redzamu failiem ārpus tā robežām un kā arī to izmantot? Tieši tāpēc PHP nodrošina globālu mainīgo. Atslēgas vārds šeit ir “globāls”. Kā PHP deklarēt globālo mainīgo? Lai sasniegtu šo mērķi, ir jāizmanto vārds "globāls". Tas ir jānovieto tieši pirms mainīgā, kuru vēlaties padarīt globālu. Tas izskatās apmēram šādi: globāls "mainīgais". Pēc šāda veida instrukciju ieviešanas pilnīgi jebkurš fails varēs strādāt ar datiem.

Ja kaut kur ir atsauces uz šo mainīgo, programma pievērsīs uzmanību globālajai versijai. Kāpēc tiek lietots tik dīvains formulējums? Lieta ir tāda, ka tajā pašā laikā var pastāvēt arī vietējās versijas. Bet tie būs pieejamāki tikai failos, kuros tie ir deklarēti. Pārējā daļā tiks piemēroti globālie PHP klases mainīgie. Šeit jums jārīkojas ļoti uzmanīgi un uzmanīgi. Lai novērstu jebkādas šaubas, sniegsim vienkāršu piemēru, kā tie varētu izskatīties: globāli a. Ja vienam failam ir piekļuve vairākiem mainīgajiem, tas var izraisīt konfliktu. Taču šeit nav iespējams precīzi pateikt, vai tiks nolasīts globālais vai lokālais mainīgais, vai arī radīsies kļūda. Ja ierakstāt to funkcijā, problēmām nevajadzētu rasties. Mainīga izmantošana ārpus funkcijas robežām būs problemātiska. Tāpēc ļoti rūpīgi jāuzrauga koda struktūra un jāpārliecinās, ka nekur nav priekšnoteikumu konfliktam.

Globālie mainīgie: cits apzīmējums
Vai ir citi veidi, kā iestatīt globālos mainīgos? Jā, un ne viens pats. Vispirms apskatīsim $GLOBALS. Tas ir asociatīvs masīvs, kurā atslēga ir nosaukums. Kā vērtība tiek izmantots globālā mainīgā saturs. Ir vērts atzīmēt, ka pēc deklarēšanas šis masīvs pastāv jebkurā tvērumā. Tas dod pamatu to uzskatīt par superglobālu. Tas izskatās šādi: $GLOBALS ['Mainīgs'].

Superglobāļi
Jebkurā programmēšanas valodā ir nosaukumi, kas ir rezervēti atsevišķām funkcijām. PHP vienkārši nav iespējams izveidot globālus mainīgos ar tādu pašu nosaukumu. Šai programmēšanas valodai ir savas īpatnības. Piemēram, ir īpaši svarīgi, lai iepriekš definētiem mainīgajiem nebūtu prefiksa “super”. Tas nozīmē, ka tie nav pieejami visās vietās. Kā šo situāciju var labot? Lai iepriekš definēts mainīgais būtu pieejams kādā vietējā tīklā, tas ir jādeklarē šādi: globālais "mainīgais". Tas jau tika minēts iepriekš. Tomēr tā nav gluži taisnība. Apskatīsim reālu piemēru:
Globālais $HTTP_POST_VARS; echo $HTTP_POST_VARS ['vārds'].
Vai jūtat atšķirību? Ir vērts paturēt prātā, ka PHP funkcijā ir jāizmanto globālais mainīgais. Tas var atrasties arī failā, kas ir iekļauts tajā.

Drošība un saites
Kā jūs pats redzat, globālā mainīgā izveide PHP nav problēma. Bet vai ir kāda specifika attiecībā uz saitēm? Izmantojot globālos mainīgos, ir iespējama neparedzēta rīcība. Bet pirms šī jautājuma izpētes sīkāk, ir nepieciešams pievērsties fonam. Versijā 4.2 direktīva register_globals tika mainīta no iespējota uz atspējota pēc noklusējuma. Daudziem lietotājiem tas ir pilnīgi nesvarīgi un veltīgi, jo no tā ir tieši atkarīga izstrādātā produkta drošība. Ja jums ir nepieciešams izveidot globālu mainīgo, PHP direktīva tieši neietekmēs šo iestatījumu. Tomēr nepareiza lietošana var kļūt par drošības risku. Tātad, piemēram, ja register_globals ir iespējotā stāvoklī, tad pirms koda izpildes tiks inicializēti dažādi nepieciešamie mainīgie. Tāpēc viņi nolēma to izslēgt. Kāpēc globālais mainīgais lielums ir saistīts ar noteiktu direktīvu? Problēma ir tāda, ka, kad tas ir iespējots, izstrādātāji ne vienmēr varēja atbildēt uz jautājumu, no kurienes tas nāk, bet, no otras puses, tas ievērojami atviegloja koda rakstīšanas procesu. Tajā pašā laikā šāda organizācija radīja zināmus draudus drošībai. Lai izvairītos no datu sajaukšanas un kļūdām, direktīva tika atspējota. Tagad apskatīsim nedrošā koda piemēru. Mēs arī aplūkosim, kā jūs varat noteikt gadījumus, kad PHP globālā mainīgā deklarācija tiek papildināta ar mēģinājumu aizstāt informāciju. Tas ir nepieciešams, lai izveidotu stabilas darba vietnes, kuras nevar uzlauzt pirmais lietotājs, kurš ar tām saskaras.

Bīstami kodi
Iestatīsim mainīgo vērtību “true” tiem lietotājiem, kuri ir pilnvaroti:
If (authenticate_user()) ($authoriza=true;) if ($authorize) (ietver “/highly/sensitive/data.php”;). Mainīgo šajā stāvoklī var iestatīt automātiski. Ņemot vērā, ka datus var vienkārši aizstāt un to izcelsmes avots nav noteikts, tad praktiski jebkurš lietotājs var iziet šādu pārbaudi un uzdoties par jebkuru. Ja vēlas, uzbrucējs var izjaukt visa skripta loģiku. Ja mainīsit direktīvas vērtību, kods darbosies pareizi. Tas ir tieši tas, kas mums jādara. Tomēr mainīgo inicializācija ir ne tikai laba prakse programmētāju vidū, bet arī garantē skripta stabilitāti.

Uzticama iespēja
Lai sasniegtu šo mērķi, varat mēģināt atspējot direktīvu vai uzrakstīt sarežģītāku kodu, piemēram, šādi: if (isset($_SESSION ['lietotājvārds'])) (atbalss "Sveiki" ($_SESSION ['lietotājvārds') ])”;) else (atbalss “Sveiks viesis”; atbalss “Laipni lūdzam!”;). Šajā gadījumā būs grūti veikt aizstāšanu. Tomēr tas ir iespējams. Lai to izdarītu, iepriekš jāparūpējas par ātrās reaģēšanas rīku pieejamību. Ja PHP ir jāiekļauj globālie mainīgie, varat izmantot šādu rīku: ja precīzi zināt, kurā diapazonā vērtība tiks saņemta, varat to uzrakstīt tā, lai skripts pārbaudītu šo faktu, salīdzinot. Tas, protams, arī nevar garantēt 100% aizsardzību pret vērtību aizstāšanu. Tomēr, izpētot iespējamās iespējas, darbība ievērojami sarežģīsies.

Kā noteikt viltošanas mēģinājumu?
Tagad pārbaudīsim, vai visu iepriekš rakstīto sapratāt pareizi. Jums pašam būs jādeklarē globālie mainīgie funkcijā. Tas ir sava veida mājasdarbs. Pirmkārt, šeit ir kods:

Sniegsim dažus paskaidrojumus. Mainīgais C_COOKIE ir ņemts no uzticama avota. Lai nodrošinātu, ka tā rezultāts atbilst gaidītajam, tiek pārbaudīta mainīgā vērtība. Ja rodas problēmas, administrators saņem paziņojumu. Ja nekas nenotiek, nekādas darbības netiks veiktas.