Php7 - PHP: funktsiya ichidagi global o'zgaruvchini ko'rsatmaydi - Rus tilida Stack Overflow. PHP o'zgaruvchilar doirasi. Siz bilmoqchi bo'lgan hamma narsa, lekin funksiyadan tashqarida global PHP o'zgaruvchisini chop etishni so'rashdan qo'rqdingiz

Oxirgi yangilanish: 11/1/2015

O'zgaruvchilar va funktsiyalardan foydalanganda, o'zgaruvchilar doirasini hisobga oling. Qo'llanish doirasi berilgan o'zgaruvchining amal qilish doirasini va foydalanish imkoniyatini belgilaydi.

Mahalliy o'zgaruvchilar

Mahalliy o'zgaruvchilar funktsiya ichida yaratiladi. Bunday o'zgaruvchilarga faqat berilgan funksiya ichidan kirish mumkin. Masalan:

Bu holda get() funksiyasi $result mahalliy o'zgaruvchisini belgilaydi. Va umumiy kontekstdan biz unga kira olmaymiz, ya'ni $a = $result yozing; Bu mumkin emas, chunki $result oʻzgaruvchisining qamrovi get() funksiyasi bilan cheklangan. Bu funksiyadan tashqarida $result oʻzgaruvchisi mavjud emas.

Xuddi shu narsa funksiya parametrlariga ham tegishli: funktsiyadan tashqarida $lowlimit va $highlimit parametrlari ham mavjud emas.

Qoidaga ko'ra, mahalliy o'zgaruvchilar yuqoridagi misoldagi kabi hisob-kitoblarning ba'zi oraliq natijalarini saqlaydi.

Statik o'zgaruvchilar

Statik o'zgaruvchilar mahalliy o'zgaruvchilarga o'xshash. Ularning farqi shundaki, funktsiya bajarilgandan so'ng ularning qiymati saqlanadi. Funktsiya har safar chaqirilganda, u avval saqlangan qiymatdan foydalanadi. Masalan:

O'zgaruvchining statik bo'lishini ko'rsatish uchun unga static kalit so'zi qo'shiladi. getCounter() ga uchta ketma-ket qo'ng'iroqlar bilan $counter o'zgaruvchisi bittaga oshiriladi.

Agar $counter o'zgaruvchisi oddiy statik bo'lmagan o'zgaruvchi bo'lsa, getCounter() har safar chaqirilganda 1 ni chop etadi.

Odatda, statik o'zgaruvchilar yuqoridagi misoldagi kabi turli xil hisoblagichlarni yaratish uchun ishlatiladi.

Global o'zgaruvchilar

Ba'zan siz o'zgaruvchining hamma joyda, global miqyosda mavjud bo'lishini xohlaysiz. Bunday o'zgaruvchilar butun dastur uchun umumiy bo'lgan ba'zi ma'lumotlarni saqlashi mumkin. Global o'zgaruvchilarni aniqlash uchun global kalit so'zdan foydalaning:1

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

getGlobal() funksiyasini chaqirgandan so'ng, $gvar o'zgaruvchisiga dasturning istalgan qismidan kirish mumkin.

Eslatma: Saytning moslashtirilgan versiyasi faollashtirildi, u avtomatik ravishda brauzeringizning kichik hajmiga moslashadi va o'qish qulayligi uchun saytning ba'zi tafsilotlarini yashiradi. Tomosha qilishdan zavqlaning!

Salom aziz blog o'quvchilari Sayt yoqilgan! Biz PHPda funksiya mavjudligini bilib oldik, biz o'z funksiyalarimizni yaratishni, ularga argumentlar berishni va ularni bajarishga chaqirishni o'rgandik. PHP-da funksiyalar mavzusini davom ettirib, quyidagi narsalarni ta'kidlash kerak:

  • Funksiya ichida siz istalgan PHP kodidan (davrlar, shartlar, har qanday operatsiyalar), shu jumladan boshqa funktsiyalardan (ham o'rnatilgan, ham moslashtirilgan) foydalanishingiz mumkin;
  • Funktsiya nomi lotin harfi yoki pastki chiziq bilan boshlanishi kerak, undan keyin lotin harflari, raqamlar yoki pastki chiziqning istalgan soni qo'yilishi kerak;
  • Barcha funktsiyalar global qamrovga ega, ya'ni har qanday funktsiyani istalgan joyda chaqirish mumkin, hatto bu funktsiya boshqasining ichida aniqlangan bo'lsa ham;
  • PHP funksiyani haddan tashqari yuklashni qo'llab-quvvatlamaydi, shuningdek yaratilgan funktsiyani qayta aniqlash (o'zgartirish, qo'shish) yoki o'chirish imkoniyati yo'q;
  • Funktsiyalarni ishlatishdan oldin ularni aniqlash shart emas. Ya'ni, agar siz avval funktsiyani chaqirsangiz va uni quyidagi kodda tasvirlab bersangiz, bu ishlashga ta'sir qilmaydi va xatolarga olib kelmaydi.

Shartli funksiyalar

Biz shartga qarab funksiya yaratishimiz (aniqlashimiz, tavsiflashimiz) mumkin. Masalan:

//funksiya sayHi deb ataladi, uni istalgan joyda chaqirish mumkin /*sayGoodbye funksiyasini bu yerda chaqirib bo‘lmaydi, chunki biz hali shartni tekshirmadik va if konstruksiyasiga kirmadik*/ if($apply)( sayGoodbye())( echo "Hammaga xayr!
"; } } /*endi biz goodbye deb qo'ng'iroq qilishimiz mumkin*/
"; }

Natija:

Va bu misolni ko'rib chiqing:

/*va agar siz bu yerda deyishga xayrlashsangiz shunday bo'ladi*/ Alvido(); if($apply)( sayGoodbye())( echo "Hammaga xayr!
"; ) ) funksiya sayHi())( echo "Hammaga salom!
"; }

Natija:

Darhaqiqat, men qancha ishlagan bo'lsam ham, men hech qaerda bunday narsalarni ko'rmaganman, lekin siz tilning barcha imkoniyatlarini yodda tutishingiz kerak.

Ichki funksiyalar

Ichki funktsiya boshqa funktsiya ichida e'lon qilingan funktsiyadir. Misol:

/*Siz bu yerda sayGoodbye ga qo‘ng‘iroq qila olmaysiz, chunki u sayHi funksiyasini chaqirgandan keyingina paydo bo‘ladi*/ sayHi(); /*sayHi funksiyasini chaqiring, uni istalgan joyda chaqirish mumkin*/ /*Endi biz deyishga qo'ng'iroq qilishimiz mumkin*/ Alvido(); funksiya sayHi())( echo "Hammaga salom!
"; funksiya sayGoodbye())( echo "Hammaga xayr!
"; } }

Shunga qaramay, birinchi o'tishda PHP tarjimoni sayHi funksiyasining tavsifini topganligini belgilaydi, lekin uning tanasiga kirmaydi, u faqat nomni ko'radi va tarjimon sayHi tanasiga kirmagani uchun, keyin yana bitta funktsiya ichida nimani aniqlayotganimizni bilmaydi - dey Goodbye.

Keyin kod bajarila boshlaydi, biz sayHi deb chaqiramiz, PHP tarjimoni uni bajarish uchun sayHi funksiyasining tanasiga kirishi kerak va u yerda tasodifan boshqa funksiya tavsifini topadi - sayGoodbye, shundan so'ng sayGoodbye ni istalgan joyda, shuncha marta chaqirish mumkin. qanday istasangiz.

Lekin yuqoridagi vaziyatda juda nozik jihatga e'tibor qaratish o'rinlidir: sayHi funksiyasi bir martalik bo'ladi, chunki agar uni yana chaqirsak, PHP yana sayGoodbye funksiyasining ta'rifiga duch keladi va PHPda buni qilolmaysiz. bu - siz funktsiyalarni bekor qila olmaysiz. Men bu haqda va u bilan qanday kurashish haqida oldingi maqolada yozgan edim.

PHP-da yuqorida tavsiflangan usullar juda kam qo'llaniladi, ularni tez-tez ko'rish mumkin, masalan, JavaScript-da.

O'zgaruvchan doira

PHPda ikkita skop mavjud: global Va mahalliy. Har bir dasturlash tili tuzilmalarining qamrovi har xil. Misol uchun, C++ tilida hatto tsikllar ham o'z (mahalliy) doirasiga ega. Aytgancha, PHPda bu global qamrovdir. Ammo bugun biz funktsiyalar haqida gapiramiz.

PHP dagi funksiyalar o zining ichki qamroviga (lokal) ega, ya ni funksiya ichidagi barcha o zgaruvchilar faqat shu funksiya ichida ko rinadi.

Shunday qilib, yana bir bor: funktsiyalardan tashqaridagi hamma narsa global miqyosdir, funktsiyalar ichidagi hamma narsa mahalliy doiradir. Misol:

Hurmatli mutaxassislar, diqqat, savol! Oxirgi ko'rsatma qanday natija beradi? echo $name; ?

O'zingiz ko'rganingizdek, bizda 2 ta o'zgaruvchi bor edi $name, biri funktsiya ichida (mahalliy qamrov), ikkinchisi faqat kodda (global qamrov), o'zgaruvchiga oxirgi tayinlash $name edi $name = "Rud Sergey"; Ammo u funktsiya ichida bo'lgani uchun u o'sha erda qoldi. Global miqyosda oxirgi topshiriq bo'ldi $name = "Andrey"; bu biz aslida natija sifatida ko'rmoqdamiz.

Ya'ni, ikkita bir xil o'zgaruvchilar, lekin turli sohalarda ular kesishmaydi va bir-biriga ta'sir qilmaydi.

Keling, rasmda qamrovni ko'rsataman:

Birinchi o'tish paytida tarjimon global qamrovni qisqacha skanerlaydi, qanday o'zgaruvchilar va funktsiyalar borligini eslaydi, lekin kodni bajarmaydi.

Mahalliy miqyosdan global o'zgaruvchilarga kirish

Ammo biz hali ham global miqyosdagi bir xil $name o'zgaruvchisiga funktsiyadan kirishimiz kerak bo'lsa va shunchaki unga kirish emas, balki uni o'zgartirishimiz kerak bo'lsa-chi? Buning uchun 3 ta asosiy variant mavjud. Birinchisi kalit so'zni ishlatadi global:

"; global $name; /*bundan buyon biz global o‘zgaruvchini nazarda tutamiz $name*/$name = "Rud Sergey"; ) $name = "Andrey"; aytHi($name); echo $name; // ?

Natija:

Ammo bu usulning kamchiligi bor, chunki biz global o'zgaruvchiga kirdik $name biz mahalliy o'zgaruvchini yo'qotdik (ustiga yozdik). $name.

Ikkinchi yo'l foydalanishdan iborat PHP superglobal massivi. PHP o'zi biz global miqyosda yaratgan har bir o'zgaruvchini avtomatik ravishda ushbu massivga joylashtiradi. Misol:

$name = "Andrey"; // Xuddi shunday$GLOBALS["name"] = "Andrey";

Demak:

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

Natijada kalit so'zni ishlatish bilan bir xil bo'ladi global:

Faqat bu safar biz mahalliy o'zgaruvchini, ya'ni o'zgaruvchini qayta yozmadik $name funktsiya ichida bir xil bo'lib qoladi va teng bo'ladi "Andrey", lekin emas "Rud Sergey".

Argumentlarni mos yozuvlar bo'yicha uzatish

Uchinchi yo'l- bu manzilni uzatish ( havolalar) o'zgaruvchining qiymati emas, balki. PHPdagi havolalar boshqa dasturlash tillaridan farqli ravishda unchalik muvaffaqiyatli emas. Biroq, men sizga odatda PHP 5.3 va undan yuqori versiyalarida qo'llab-quvvatlanadigan funktsiyaga havola orqali argumentni uzatishning yagona to'g'ri variantini aytib beraman. Havolalar bilan ishlashning boshqa usullari ham bor, lekin ular PHP 5.2 va undan pastroq versiyalarda ishlagan, natijada PHP ishlab chiquvchilari ulardan voz kechishga qaror qilishgan, shuning uchun biz ular haqida gapirmaymiz.

Shunday qilib, PHP 5.3 va undan yuqori versiyalarda argumentning TO'G'RI topshirilishi quyidagicha amalga oshiriladi:

Funktsiya sayHi(& $name)(

Funktsiya tavsifining o'zida biz ampersand belgisini (&) qo'shdik - bu belgi biz o'zgaruvchining qiymatini qabul qilmasligimizni anglatadi, lekin xotiradagi ushbu qiymatga havola (manzil). PHP-dagi havolalar bir xil qiymatga ishora qiluvchi ikkita o'zgaruvchini yaratishga imkon beradi. Bu shuni anglatadiki, ushbu o'zgaruvchilardan biri o'zgarganda, ikkalasi ham o'zgaradi, chunki ular xotirada bir xil qiymatga ishora qiladi.

Va oxirida bizda:

//qiymatni emas, balki qiymatga havolani qabul qiling echo "Salom, ".$name."!
"; $name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

Natija:

Statik o'zgaruvchilar

Quyidagi vaziyatni tasavvur qiling: jami necha marta salom berganimizni hisoblashimiz kerak. Mana biz nima qilmoqchimiz:

"; $c++; // hisoblagichni 1 ga oshiring


Natija:

O'zgaruvchan $c uning ma'nosini eslamaydi, har safar yangidan yaratiladi. Biz mahalliy o'zgaruvchimizni yaratishimiz kerak $c funktsiyani bajargandan so'ng uning qiymatini esladilar, buning uchun ular kalit so'zdan foydalanadilar statik:

// hisoblagich, statik qilingan echo "Salom, ".$name."!
"; $c++; // hisoblagichni 1 ga oshiring echo "Shunchaki salom aytdim". $c . " bir marta.


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

Natija:

Qaytariladigan qiymatlar

Funktsiyalar qiymatlarni qaytarish kabi qulay narsaga ega. Bu funksiya ekranga biror narsani chop etish o'rniga hamma narsani o'zgaruvchiga qo'yadi va bu o'zgaruvchini bizga beradi. Va biz u bilan nima qilishni allaqachon hal qilyapmiz. Masalan, ushbu funktsiyani olaylik, u raqamni kvadratga aylantiradi:

Natija:

Keling, uni ekranda ko'rsatish o'rniga, bajarilish natijasini qaytaradigan qilib yarataylik. Buning uchun return kalit so'zidan foydalaning:

Natija:

Endi biz buni turli yo'llar bilan ishlatishimiz mumkin:

// natijani chiqaradi aks-sado "
"; $num = getSquare(5); echo $num;

Natija:

E'tibor bering, kalit so'z qaytish shunchaki qiymat qaytarmaydi, balki funktsiyani, ya'ni kalit so'z ostidagi barcha kodlarni to'liq to'xtatadi qaytish hech qachon bajarilmaydi. Boshqacha qilib aytadigan bo'lsak, funksiyalarni qaytarish ham shunga o'xshash ishlaydi tanaffus looplar uchun:

echo "PHP hech qachon menga etib bormaydi:(";) echo getSquare(5); // natijani chiqaradi aks-sado "
"; $num = getSquare(5); // natijani o'zgaruvchiga tayinladi echo $num; // o'zgaruvchini ekranda ko'rsatish

Natija:

Ya'ni qaytish– bu ham funksiyadan chiqish. Uni qaytarish qiymatisiz, faqat chiqish uchun ishlatish mumkin.

Rekursiv funksiya

Rekursiv funktsiya o'zini chaqiradigan funktsiyadir. Rekursiya tez-tez ishlatilmaydi va resurs talab qiladigan (sekin) operatsiya hisoblanadi. Ammo shunday bo'ladiki, rekursiyadan foydalanish eng aniq va oddiy variantdir. Misol:

"; agar ($ raqam< 20){ // rekursiya cheksiz bo'lib qolmasligi uchun countPlease(++$raqam); // countPlease funktsiyasi o'zini chaqirdi) ) countPlease(1);

Natija:

Agar siz rekursiyasiz qanday qilishni bilsangiz, unda buni qilish yaxshidir.

PHPda kuchli yozish (turni yaxshilash)

PHP kuchli matn terish uchun kichik qadamlar qo'yadi, shuning uchun biz qanday funktsiyani olish kerakligini oldindan belgilashimiz mumkin (bu deyiladi) turi-maslahat):

Natija:

Tushunarli xato: countPlease() ga uzatilgan 1-argument 7-qatorda /home/index.php da chaqirilgan va 3-qatorda /home/index.php da belgilangan butun son berilgan massiv boʻlishi kerak.

Xato bizga funktsiya massivni olishni kutayotganini aytadi, lekin buning o'rniga biz unga raqamni uzatamiz. Afsuski, hozircha biz faqat (massiv) turini belgilashimiz mumkin va PHP 5.4 bilan biz ham shunday variantni qo'shdik. chaqirish mumkin:

Qo'ng'iroq qilish mumkin berilgan qiymatni funksiya sifatida chaqirish mumkinligini tekshiradi. Chaqiriladigan yoki satr o'zgaruvchisi tomonidan ko'rsatilgan funksiya nomi yoki ob'ekt va chaqirilayotgan usulning nomi bo'lishi mumkin. Ammo biz ob'ektlar va usullar haqida keyinroq gaplashamiz (bu ob'ektga yo'naltirilgan dasturlash bo'limi), lekin siz allaqachon funktsiyalar bilan tanishsiz. Men sizga ish natijasini ko'rsata olmayman, chunki menda hozirda PHP 5.3 bor, lekin shunday bo'lardi:

getEcho funksiyasi deb ataladi

O'zgaruvchan uzunlikdagi argumentlardan foydalanish

Va nihoyat, yana bir kamdan-kam ishlatiladigan nuance. Vaziyatni tasavvur qiling: biz funktsiyaga argumentlarni o'tkazamiz, garchi biz ularni funktsiyada tasvirlamagan bo'lsak ham, masalan:

Natija:

Ko'rib turganingizdek, hech qanday xatolik yo'q, lekin bizning o'tgan argumentlarimiz hech qaerda ishlatilmaydi. Ammo bu ularning yo'qligini anglatmaydi - ular hali ham funktsiyaga o'tgan va biz ulardan foydalanishimiz mumkin; buning uchun o'rnatilgan PHP funktsiyalari mavjud:

func_num_args()- Funksiyaga uzatilgan argumentlar sonini qaytaradi
func_get_arg(tartib raqami)- Argumentlar ro'yxatidan elementni qaytaradi
func_get_args()- Funktsiya argumentlarini o'z ichiga olgan massivni qaytaradi

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

Natija:

Xulosa

Bugungi maqola PHP dagi funksiyalar mavzusidagi yakuniy maqoladir. Endi siz ushbu mavzu bo'yicha bilimlaringizning to'liqligiga ishonchingiz komil bo'lishi mumkin va o'zingizning ehtiyojlaringiz uchun funktsiyalardan ishonch bilan foydalanishingiz mumkin.

Agar kimdir bu borada yaxshilanishni xohlasa-yu, lekin buni qanday qilishni bilmasa, eng yaxshi yo'l tayyor (o'rnatilgan) PHP funktsiyalarini yozish bo'ladi, masalan, siz o'zingizning count() funksiyangizni yozishingiz mumkin. yoki boshqa.

E'tiboringiz uchun barchangizga rahmat va yana ko'rishguncha! Agar biror narsa tushunarsiz bo'lsa, sharhlarda savollaringizni berishingiz mumkin!

Ushbu qo'llanma PHP o'zgaruvchilari doirasini qamrab oladi. Mahalliy va global miqyos o'rtasidagi farqni tushuntiradi, funktsiya ichidagi global o'zgaruvchilarga qanday kirishni, supergloballar bilan qanday ishlashni va statik o'zgaruvchilarni yaratishni ko'rsatadi.

PHP tilini o'rganishni boshlaganingizda va funksiyalar va ob'ektlar bilan ishlashni boshlaganingizda, o'zgaruvchan doiralar biroz chalkash bo'ladi. Yaxshiyamki, bu boradagi PHP qoidalarini tushunish juda oson (boshqa dasturlash tillari bilan solishtirganda).

Qo'llanish doirasi nima?

O'zgaruvchilar doirasi - bu o'zgaruvchi aniqlangan va unga kirish mumkin bo'lgan kontekst. PHP ikkita o'zgaruvchan doiraga ega:

  • Global- o'zgaruvchilarga skriptning istalgan joyidan kirish mumkin
  • Mahalliy- o'zgaruvchilarga faqat ular aniqlangan funktsiya ichida kirish mumkin

O'zgaruvchining va ayniqsa mahalliyning ko'lami kodni boshqarishni sezilarli darajada osonlashtiradi. Agar barcha o'zgaruvchilar global bo'lsa, ularni skriptning istalgan joyida o'zgartirish mumkin edi. Bu tartibsizlik va katta skriptlarga olib keladi, chunki skriptning turli qismlari ko'pincha bir xil nomdagi o'zgaruvchilardan foydalanadi. Qo'llanish doirasini mahalliy kontekst bilan cheklash orqali siz o'zgaruvchiga kira oladigan kod chegaralarini aniqlaysiz, bu kodni yanada mustahkam, modulli va disk raskadrovka qilishni osonlashtiradi.

Global qamrovli o'zgaruvchilar global deyiladi va mahalliy o'zgaruvchilar mahalliy deyiladi.

Bu erda global va mahalliy o'zgaruvchilar qanday ishlashiga misol.

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

Salom Garri! $globalName qiymati: "Zoe" $localName qiymati: ""

Ushbu skriptda biz ikkita o'zgaruvchi yaratdik:

  • $globalName- Bu global o'zgaruvchan
  • $localName- Bu mahalliy sayHello() funksiyasi ichida yaratilgan o'zgaruvchi.

O'zgaruvchi va funktsiyani yaratgandan so'ng, skript sayHello() ni chaqiradi, u "Salom Garri!" . Keyin skript echo funktsiyasidan foydalangan holda ikkita o'zgaruvchining qiymatlarini chiqarishga harakat qiladi. Mana nima sodir bo'ladi:

  • Chunki $globalName funktsiyadan tashqarida yaratilgan, u skriptning istalgan joyida mavjud, shuning uchun "Zoe" chiqariladi.
  • $localName faqat sayHello() funksiyasi ichida mavjud bo'ladi. Echo ifodasi funksiyadan tashqarida boʻlgani uchun PHP mahalliy oʻzgaruvchiga kirishni taʼminlamaydi. Buning o'rniga, PHP koddan bo'sh satrning standart qiymatiga ega bo'lgan $localName deb nomlangan yangi o'zgaruvchini yaratishini kutadi. shuning uchun echoga ikkinchi qo'ng'iroq $localName o'zgaruvchisi uchun "" qiymatini chiqaradi.

Funktsiya ichidagi global o'zgaruvchilarga kirish

Global o'zgaruvchiga kirish uchun ishlamay qolgan Uning ismini yozish kifoya. Ammo global o'zgaruvchiga kirish uchun funksiya ichida, avval global kalit so'z yordamida o'zgaruvchini funktsiyada global deb e'lon qilishingiz kerak:

myFunction() funktsiyasi ( global $globalVariable; // $globalVariable global o'zgaruvchisiga kirish)

Agar buni qilmasangiz, PHP siz mahalliy o'zgaruvchi yaratayotgan yoki foydalanayotgan deb hisoblaydi.

Funktsiya ichida global o'zgaruvchidan foydalanadigan misol skripti:

"; global $globalName; echo "Salom $globalName!
"; ) aytsalom(); ?>

Amalga oshirilganda, skript chiqadi:

Salom Garri! Salom Zoya!

SayHello() funktsiyasi $globalName o'zgaruvchisini global deb e'lon qilish uchun global kalit so'zdan foydalanadi. Keyin u o'zgaruvchiga kirishi va uning qiymatini chiqarishi mumkin ("Zoe").

Supergloballar nima?

PHP da turli ma'lumotlarni o'z ichiga olgan oldindan belgilangan global massivlarning maxsus to'plami mavjud. Bunday massivlar deyiladi supergloballar, chunki ular skriptning istalgan joyidan, jumladan, ichki funksiya maydonidan foydalanish mumkin va global kalit so'z yordamida aniqlanishi shart emas.

PHP 5.3 versiyasida mavjud bo'lgan supergloballar ro'yxati:

  • $GLOBALS - skriptdagi barcha global o'zgaruvchilar ro'yxati (supergloballardan tashqari)
  • $_GET - GET so'rovi yordamida brauzer tomonidan yuborilgan barcha shakl maydonlari ro'yxatini o'z ichiga oladi
  • $_POST - POST so'rovi yordamida brauzer tomonidan yuborilgan barcha shakl maydonlari ro'yxatini o'z ichiga oladi
  • $_COOKIE - brauzer tomonidan yuborilgan barcha cookie-fayllar ro'yxatini o'z ichiga oladi
  • $_REQUEST - $_GET, $_POST, $_COOKIE massivlarida joylashgan barcha kalit/qiymat kombinatsiyalarini o'z ichiga oladi
  • $_FILES - brauzer tomonidan yuklab olingan barcha fayllar ro'yxatini o'z ichiga oladi
  • $_SESSION - joriy brauzer uchun seans o'zgaruvchilarini saqlash va ulardan foydalanish imkonini beradi
  • $_SERVER - server haqidagi ma'lumotlarni o'z ichiga oladi, masalan, bajarilayotgan skriptning fayl nomi va brauzerning IP-manzili.
  • $_ENV - PHP ga uzatiladigan muhit o'zgaruvchilari ro'yxatini o'z ichiga oladi, masalan, CGI o'zgaruvchilari.
Misol uchun, skript so'rovi URL satriga kiritilgan o'zgaruvchilar qiymatlarini olish va ularni sahifada ko'rsatish uchun $_GET dan foydalanishingiz mumkin:

Agar yuqoridagi skriptni http://www.example.com/script.php?yourName=Fred URL manzilidan foydalanib ishga tushirsangiz, u chiqadi:

Salom Fred!

Ogohlantirish! Haqiqiy skriptda bunday ma'lumotlarni uzatish zaif xavfsizlik tufayli hech qachon ishlatilmasligi kerak. Siz har doim ma'lumotlarni tekshirishingiz yoki filtrlashingiz kerak.

$GLOBALS superglobal-dan foydalanish juda qulay, chunki u global kalit so'zni talab qilmasdan funksiyadagi global o'zgaruvchilarga kirishni tashkil qilish imkonini beradi. Masalan:

"; ) sayHello(); // "Salom, Zoya!" ?> chop etadi

Statik o'zgaruvchilar: ular bir joyda

Funktsiya ichida mahalliy o'zgaruvchi yaratganingizda, u faqat funksiya ishlayotgan vaqtda mavjud bo'ladi. Funktsiya tugagach, mahalliy o'zgaruvchi yo'qoladi. Funktsiya qayta chaqirilganda yangi mahalliy o'zgaruvchi yaratiladi.

Aksariyat hollarda bu ajoyib ishlaydi. Shunday qilib, funktsiyalar o'z-o'zidan mavjud va har doim chaqirilganda bir xil ishlaydi.

Biroq, funksiya chaqiruvlari orasida uning qiymatini "eslab qoladigan" mahalliy o'zgaruvchini yaratish qulay bo'lgan holatlar mavjud. Bunday o'zgaruvchiga statik deyiladi.

Funksiyada statik oʻzgaruvchini yaratish uchun oʻzgaruvchi nomidan oldin static kalit soʻzidan foydalanish va unga boshlangʻich qiymat berishni unutmang. Masalan:

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

Statik o'zgaruvchidan foydalanish qulay bo'lgan vaziyatni ko'rib chiqaylik. Aytaylik, siz chaqirilganda vidjet yaratadigan va allaqachon yaratilgan vidjetlar sonini ko‘rsatadigan funksiya yaratdingiz. Mahalliy o'zgaruvchidan foydalanib, shunday kod yozishga urinib ko'rishingiz mumkin:


"; echo createWidget() . " Biz allaqachon yaratganmiz.
"; echo createWidget() . " Biz allaqachon yaratganmiz.>
"; ?>

Ammo, funktsiya har safar chaqirilganda $numWidgets o'zgaruvchisi yaratilganligi sababli biz quyidagi natijani olamiz:

Biz ba'zi vidjetlar yaratamiz... Biz allaqachon 1 tasini yaratdik. Biz allaqachon 1 tasini yaratdik. Biz allaqachon 1 tasini yaratdik.

Ammo statik o'zgaruvchidan foydalanib, biz qiymatni bir funktsiya chaqiruvidan boshqasiga saqlashimiz mumkin:

"; echo createWidget() . " Biz allaqachon yaratganmiz.
"; echo createWidget() . " Biz allaqachon yaratganmiz.
"; echo createWidget() . " >biz allaqachon yaratganmiz.
"; ?>

Endi skript kutilgan natijani beradi:

Biz ba'zi vidjetlar yaratamiz... Biz allaqachon 1 tasini yaratdik. Biz allaqachon 2 tasini yaratdik. Biz allaqachon 3 tasini yaratdik.

Statik o'zgaruvchi o'z qiymatini funksiya chaqiruvlari orasida saqlab qolsa-da, u faqat skript ishlayotgan paytda amal qiladi. Skript bajarilishini tugatgandan so'ng, barcha statik o'zgaruvchilar, mahalliy va global o'zgaruvchilar yo'q qilinadi.

Ana xolos! PHP hujjatlariga tez-tez murojaat qiling.

Bu erda ta'kidlash kerak bo'lgan narsa shundaki, siz taqdim etgan kod elementi sifatida ko'rib chiqilishi kerak yomon dizayn va dasturlash uslubi, chunki u kiritilgan faylni bir zumda bajariladigan operatsiyalar to'plami sifatida ko'radi.

Eng to'g'ri yondashuv, amallar to'plamini o'z nomi bilan faylga funksiyalar/sinflar sifatida qo'yish, faylni (funktsiyalardan tashqari hech qanday qaytarish bayonotisiz) kiritish va keyin funktsiyani chaqirishdir. aniq kerakli argumentlar to'plami bilan.

Xo'sh, muammo nimada?

Hammasi juda oddiy, siz buni qilasiz o'z ichiga oladi usul ichida usul, ya'ni kiritilgan faylda ko'rsatilgan o'zgaruvchilar usul doirasida ishga tushirilgan usul. Shuning uchun, o'zgaruvchi $lang global emas va usulning ko'rinishi bilan cheklangan, va siz global o'zgaruvchiga kirasiz, shuning uchun modifikatordan foydalanganda global u null ga teng bo'ladi.

Agar siz global miqyosga kiritsangiz, lang o'zgaruvchisi ommaviy (global) bo'ladi va undan foydalanish mumkin bo'ladi. Buni tekshirish oson; kiritilgan faylga biron bir o'zgaruvchini aniqlashni boshlashdan oldin yozing global $ o'zgaruvchisi.

Misol:

"file1.php" ni o'z ichiga oladi; include2() funktsiyasi ("file2.php" ni o'z ichiga oladi; )
  • file1.php global miqyosda aniqlanadi.
  • file2.php include2 funksiyasining mahalliy doirasida aniqlanadi.

Global o'zgaruvchilar va shunga o'xshashlar bilan yondashuv kelajakda sizga muammolarni keltirib chiqaradigan tayoqchadir. Funktsiyalar aniq belgilangan bo'lishi, noyob nomga ega bo'lishi va talab bo'yicha bajarilishi kerak.

Nima uchun global o'zgaruvchilar bilan yondashuv yomon?

Gap shundaki, global o'zgaruvchilar hamma joyda, global miqyosda ko'rinadi. Bu qulay: hech qanday cheklovlar yo'q. Boshqa tomondan, ma'lumotlarni kim o'zgartirayotganini kuzatish mutlaqo mumkin emas. Nazorat qilinmagan o'zgarishlar, global o'zgaruvchilar nima uchun yomon ekanligi so'ralganda, odatda aqlga keladigan birinchi narsadir.

Aytaylik, sizda natijasi global o'zgaruvchiga bog'liq bo'lgan funksiya bor. Siz uni chaqirasiz, qo'ng'iroq qilasiz, lekin 10 daqiqadan so'ng funksiya noto'g'ri natijalarni qaytara boshlaydi. Nima bo'ldi? Axir, siz unga kirish sifatida bir xil parametrlar to'plamini o'tkazyapsizmi? Hmm, kimdir global o'zgaruvchining qiymatini o'zgartirdi ... Bu kim bo'lishi mumkin? Ha, har kim - axir, global o'zgaruvchi hamma uchun mavjud.

Kichik dasturlarni loyihalash uchun eng yaxshi retsept: funktsiyangiz natijasini faqat argumentlarga bog'liq qilib qo'ying. Bu intilish uchun ideal.

Loyihangizda global o'zgaruvchilardan keraksiz foydalanmang, mahalliy qamrovning barcha xususiyatlaridan foydalaning, parametrlarni funksiya argumentlariga o'tkazing va kodni yozish, saqlash va sinab ko'rish osonroq bo'ladi.

Global o'zgaruvchilar uchun eng yaxshi prefiks nima ekanligini bilasizmi?

Pastki dastur ichida aniqlangan o'zgaruvchilar (foydalanuvchi tomonidan belgilangan funktsiya). Ularga faqat ular belgilangan funksiya doirasida kirish mumkin.

PHP uchun funksiyada e'lon qilingan va foydalaniladigan barcha o'zgaruvchilar sukut bo'yicha funksiya uchun lokaldir. Ya'ni, sukut bo'yicha funktsiya tanasidagi global o'zgaruvchining qiymatini o'zgartirish mumkin emas.

Agar foydalanuvchi aniqlagan funksiyaning tanasida global oʻzgaruvchi nomi bilan bir xil nomga ega oʻzgaruvchidan foydalansangiz (foydalanuvchi tomonidan belgilangan funksiyadan tashqarida joylashgan), bu mahalliy oʻzgaruvchining global oʻzgaruvchiga hech qanday aloqasi boʻlmaydi. Bunday holatda, global o'zgaruvchining nomi bilan bir xil nomga ega bo'lgan mahalliy o'zgaruvchi foydalanuvchi tomonidan belgilangan funksiyada yaratiladi, ammo bu mahalliy o'zgaruvchi faqat ushbu foydalanuvchi tomonidan belgilangan funksiya doirasida mavjud bo'ladi.

Keling, ushbu haqiqatni aniq bir misol bilan tushuntiramiz:

$a = 100 ;

funktsiya funktsiyasi() (
$a = 70;
aks-sado "

$a

" ;
}
funktsiya ();
aks-sado "

$a

" ;
?>

Skript avval 70, keyin esa 100 ni chop etadi:

70
100

Ushbu kamchilikdan xalos bo'lish uchun PHPda maxsus ko'rsatma mavjud global, foydalanuvchi tomonidan belgilangan funktsiyaga global o'zgaruvchilar bilan ishlashga ruxsat berish. Keling, ushbu printsipni aniq misollar yordamida ko'rib chiqaylik:

$a = 1;
$b = 2;

Funktsiya summasi()
{
global $a, $b;

$b = $a + $b ;
}

Sum();
echo $b ;
?>

Yuqoridagi skript chiqadi " 3 ". Aniqlashdan keyin $a Va $b kabi funktsiya ichida global ushbu o'zgaruvchilarning har qandayiga barcha havolalar ularning global versiyasiga ishora qiladi. Foydalanuvchi tomonidan belgilangan funksiyalar tomonidan boshqarilishi mumkin bo'lgan global o'zgaruvchilar soniga cheklov yo'q.

Global o'zgaruvchilarga kirishning ikkinchi usuli - bu PHP tomonidan belgilangan maxsus massivdan foydalanish $GLOBALS. Oldingi misolni quyidagicha qayta yozish mumkin:

Global o'rniga $GLOBALS dan foydalanish:

$a = 1;
$b = 2;

Funktsiya summasi()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}

Sum();
echo $b ;
?>

$GLOBALS kaliti nomi va qiymati global oʻzgaruvchining mazmuni boʻlgan assotsiativ massivdir. E'tibor bering, $GLOBALS har qanday miqyosda mavjud, chunki bu massivdir. Quyida supergloballarning imkoniyatlarini ko'rsatadigan misol keltirilgan:

test_global() funktsiyasi
{
// Ko'pchilik oldindan belgilangan o'zgaruvchilar emas
// "super" va mahalliy hududda mavjud bo'lishi
// funktsiyaning ko'rinishi "global" ni ko'rsatishni talab qiladi.
global $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS["name"];

// Supergloballar har qanday miqyosda mavjud
// ko'rinish va "global" ko'rsatilishini talab qilmaydi.
// Supergloballar PHP 4.1.0 dan beri mavjud
echo $_POST ["ism" ];
}
?>