Ողջույն հարգելի ընթերցողներ։ Այսօր մենք կծանոթանանք PHP լեզվի սուպերգլոբալ փոփոխականների հետ (superglobals)։
Դրանք նախապես հայտարարված փոփոխականներ են, որոնք տեսանելի են PHP կոդի ցանկացած հատվածում, այսինքն ֆունկցիաների և մեթոդների մեջ դրանց հասանելիություն ստանալու համար պետք չէ գրել global $variable, այլ պետք է ուղղակի կանչել սուպերգլոբալը(օրինակ՝ $_POST)։
Սուպերգլոբալներն իրենցից ներկայացնում են ասոցիատիվ զանգվածներ (associative array)։ Դրանք հայտնվել են PHP լեզվում 4.1.0 տարբերակից (version)։
Սուպերգլոբալներն են․
$GLOBALS
$GLOBALS-ը ասոցիատիվ զանգված է, որում առկա են բոլոր գլոբալ տեսանելիության տիրույթի փոփոխականների հղումները։ Փոփոխականների անունները հանդիսանում են զանգվածի բանալիներ (key)։ Երևի արդեն պարզ է, որ այս զանգվածի մեջ առկա են նաև մյուս սուպերգլոբալները, որոնք հանդիսանում են այս զանգվածին ներդրված զանգվածներ (օրինակ՝ $GLOBALS[‘_GET’])։
Ի տարբերություն մյուս սուպերգլոբալների՝ այս սուպերգլոբալը միշտ հասանելի է (մյուս սուպերգլոբալների հասանելիության սահմանափակումների մասին կխոսենք դրանցից յուրաքանչյուրի քննարկման ժամանակ)։
Որպեսզի ավելի լավ պատկերացնենք վերը նշվածը ստեղծենք index-globals.php ֆայլ և նրանում գրենք հետևյալ կոդը․
<?php function test() { $variable = 'Local variable'; echo 'from $GLOBALS array - ' . $GLOBALS['variable'] . '<br />'; echo 'local variable $variable - ' . $variable; } $variable = 'Global variable'; test(); ?>
Եթե գործարկենք այս կոդը, ապա կունենանք հետևյալ արդյունքը․
from $GLOBALS array - Global variable local variable $variable - Local variable
Այստեղ տեսնում ենք, որ $GLOBALS-ում variable անվամբ պահվում է ոչ թե ֆունկցիայի մարմնում գրված փոփոխականը, այլ դրսում նույն անունով հայտարարված փոփոխականը։ Դրա պատճառն այն է, որ ֆունկցիայի մարմնում հայտարարված փոփոխականները չեն գտնվում գլոբալ տեսանելիության տիրույթում։
$_SERVER
Այս սուպերգլոբալը զանգված է, որում առկա են տվյալներ կոդերի, դրանց վայրի և վերնագրերի մասին։ Սրանում տվյալները ստեղծում է վեբ-սերվերը և կախված դրանից որոշ տվյալներ կարող են բացակայել։
Ես կներկայացնեմ այս զանգվածում առկա տվյալներից մի քանիսը։ Եթե Դուք հարցեր ունենաք մյուս տվյալների հետ կապված՝ կարող եք դիմել մեզ։
Այսպիսով՝ այդ տվյալներից են․
- PHP_SELF — ցույց է տալիս այն ֆայլի անունը, որը տվյալ պահին գործարկված է (ֆայլի գտնվելու վայրը չի պահվում ամբողջությամբ, օրինակ, եթե ֆայլը, որը գործարկված է, ունի հետևյալ հասցեն՝ http://it-blog.am/dir/file.php, ապա $_SERVER[‘PHP_SELF’]-ը կվերադարձնի /dir/file.php),
- SERVER_ADDR — ցույց է տալիս այն սերվերի IP հասցեն, որի վրա գործարկված է տվյալ ֆայլը,
- REQUEST_METHOD — ցույց է տալիս, թե ինչ մեթոդով է կատարվել հարցումը (օրինակ POST, GET)։
Եթե ուզում եք տեսնել զանգվածի պարունակությունը, ապա ավելացրեք հետևյալ կոդի մասը Ձեր կոդի մեջ․
var_dump($_SERVER)
$_GET
Այս սուպերգլոբալը զանգված է, որի մեջ առկա են HTTP հարցման բոլոր GET մեթոդով փոխանցված փոփոխականները։
Օրինակ, եթե հղումն ունի հետևյալ տեսքը՝
http://it-blog.am?name=hello
ապա $_GET[‘name’] կանչելուց կունենանք hello արտահայտությունը։
Եկեք մի փոքր օրնակի վրա դիտարկենք ասվածը․ վերցնենք երկու ֆայլ՝ index-get.html և index-get.php: Առաջին ֆայլում կառուցենք հասարակ form, որը բաղկացած կլինի երկու input-ներից և տվյալները կուղարկի երկրորդ ֆայլին (պարզ է, որ տվյալները ուղարկելու ենք GET մեթոդով)։ Երկրորդ ֆայլում ուղղակի կարտածենք ստացված տվյալները։
Ասվածը իրագործելու համար առաջին ֆայլում գրում ենք հետևյալ կոդը․
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> </head> <body> <form action="./index-get.php" method="GET"> First Name: <input type="text" name="first_name" /><br /> Last Name: <input type="text" name="last_name" /><br /> <button type="submit" name="submit">Submit</button> </form> </body> </html>
Մի քանի խոսքով ներկայացնեմ form հատկորոշիչում (tag) գրվածը․
- action — ցույց է տալիս, թե որ ֆայլին են ուղարկվելու տվյալները
- method — ցույց է տալիս, թե ինչ մեթոդով են ուղարկվելու տվյալները
- name — այսպես կոչված անուն, որով դիմելու ենք տվյալ դաշտում լրացված արտահայտությանը
Եթե ուշադիր լինենք՝ կտեսնենք, որ դիտարկչի հղման դաշտում՝ հղման վերջից կցվում է ? և ուղարկվող տվյալները, որոնք իրարից առանձնացվում են & նշանով։
Երկրորդ ֆայլում գրում ենք հետևյալը․
<?php if (isset($_GET['submit'])) { echo 'First Name: ' . $_GET['first_name'] . '<br />'; echo 'Last Name: ' . $_GET['last_name']; } ?>
Այստեղ ուղղակի ստուգում ենք, եթե սեղմվել է Submit կոճակը (այսինքն ուղարկվել են տվյալները), ապա արտածում ենք տվյալները։
Այս սուպերգլոբալը միշտ հասանելի է, սակայն միշտ չէ, որ նրանում առկա են տվյալներ։ Որպեսզի այն դատարկ չլինի՝ պետք է, որ այդ ֆայլին ուղարկված լինեն տվյալներ GET մեթոդով։
$_POST
Այս սուպերգլոբալը զանգված է, որի մեջ առկա են HTTP հարցման բոլոր POST մեթոդով փոխանցված փոփոխականները։
Ի տարբերություն նախորդ օրինակի, այս դեպքում հարցման ժամանակ տվյալները չեն կցվում հղմանը։
Եկեք դիտարկենք նախորդ օրինակը, միայն այն տարբերությամբ, որ տվյալները կուղարկենք POST մեթոդով և կստանանք $_POST սուպերգլոբալ զանգվածից։
Կրկին ստեղծենք երկու ֆայլեր՝ index-post.html և index-post.php:
Առաջին ֆայլում կգրենք նույնը, ինչ նախորդ օրինակում, միայն method-ը GET-ի փոխարեն գրում ենք POST, իսկ action-ը՝ index-post.php.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> </head> <body> <form action="./index-get.php" method="POST"> First Name: <input type="text" name="first_name" /><br /> Last Name: <input type="text" name="last_name" /><br /> <button type="submit" name="submit">Submit</button> </form> </body> </html>
Երկրորդ ֆայլում գրում ենք նույնը, ինչ նախորդ օրինակում, միայն տվյալները պետք է ստանանք ոչ թե $_GET-ից, այլ $_POST-ից․
<?php if (isset($_POST['submit'])) { echo 'First Name: ' . $_POST['first_name'] . '<br />'; echo 'Last Name: ' . $_POST['last_name']; } ?>
Մենք տեսնում ենք, որ ստանում ենք նույն արդյունքը, ինչ նախորդ օրինակում։ Եթե հարցումը ուղարկելուց ուշադիր լինենք, ապա կտեսնենք, որ հղմանը ոչինչ չի կցվում։
Այս սուպերգլոբալը միշտ հասանելի է, սակայն միշտ չէ, որ նրանում առկա են տվյալներ։ Որպեսզի այն դատարկ չլինի՝ պետք է, որ այդ ֆայլին ուղարկված լինեն տվյալներ POST մեթոդով։
$_FILES
Այս սուպերգլոբալը զանգված է, որի մեջ առկա են HTTP հարցման POST եղանակով փոխանցված ֆայլերը։
Դիտարկենք նախորդ օրինակը մի փոքր փոփոխությամբ։
Կրկին ստեղծենք երկու ֆայլեր՝ index-files.html և index-files.php:
Ինչպես գիտեք, որպեսզի հարցման ժամանակ ֆայլեր ուղարկենք անհրաժեշտ է form հատկորոշիչին ավելացնել enctype ատրիբուտը, որի արժեքը պետք է լինի multipart/form-data, իսկ հենց ֆայլ ավելացնելու համար պետք է ունենանք input հատկորոշիչ, որի տիպը պետք է լինի file:
Ասվածը կունենա հետևյալ տեսքը․
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> </head> <body> <form action="./index-files.php" method="POST" enctype="multipart/form-data"> First Name: <input type="text" name="first_name" /><br /> Last Name: <input type="text" name="last_name" /><br /> Select File: <input type="file" name="file" /><br /> <button type="submit" name="submit">Submit</button> </form> </body> </html>
Երկրորդ ֆայլում գրում ենք հետևյալը․
<?php if (isset($_POST['submit'])) { echo 'First Name: ' . $_POST['first_name'] . '<br />'; echo 'Last Name: ' . $_POST['last_name']; } if (!empty($_FILES)) { var_dump($_FILES); } ?>
Այստեղ վերևում ուղղակի ստուգում ենք, եթե սեղմվել է Submit կոճակը (այսինքն ուղարկվել են տվյալները), ապա արտածում ենք տվյալները, իսկ ներքևում ստուգում ենք, եթե $_FILES զանգվածը դատարկ չէ (այսինքն հարցման ժամանակ ուղարկվել են ֆայլեր), ապա ուղղակի արտածում ենք զանգվածի պարունակությունը։
Այս սուպերգլոբալը միշտ հասանելի է, սակայն միշտ չէ, որ նրանում առկա են տվյալներ։ Որպեսզի այն դատարկ չլինի՝ պետք է, որ այդ ֆայլին ուղարկված լինեն տվյալներ POST մեթոդով և այդ տվյալների մեջ լինի գոնե մեկ ֆայլ։
$_COOKIE
Այս սուպերգլոբալը զանգված է, որի մեջ առկա են HTTP հարցման cookie տվյալները։
Այս սուպերգլոբալը միշտ հասանելի է, սակայն միշտ չէ, որ նրանում առկա են տվյալներ։ Որպեսզի այն դատարկ չլինի՝ պետք է, որ ստեղծված լինեն cookie տվյալներ, որոնք հասանելի են տրված կոդին։ Եթե այդպիսիք կան, ապա կարող եք դրանք տեսնել՝ Ձեր կոդի մեջ ավելացնելով հետևյալ հատվածը․
var_dump($_COOKIE);
$_SESSION
Այս սուպերգլոբալը զանգված է, որի մեջ առկա են տվյալ կոդի համար հասանելի սեսսիայի (session) փոփոխականները։
Այս սուպերգլոբալը միշտ հասանելի է, սակայն միշտ չէ, որ նրանում առկա են տվյալներ։ Որպեսզի այն դատարկ չլինի՝ պետք է, որ ստեղծված լինեն սեսսիայի տվյալներ, որոնք հասանելի են տրված կոդին։ Եթե այդպիսիք կան, ապա կարող եք դրանք տեսնել՝ Ձեր կոդի մեջ ավելացնելով հետևյալ հատվածը․
var_dump($_SESSION)
$_REQUEST
Այս սուպերգլոբալը զանգված է, որի մեջ առկա են HTTP հարցման բոլոր փոփոխականները։
Այն իր մեջ ներառում է $_GET, $_POST և $_COOKIE սուպերգլոբալների տվյալները։
Համոզվելու համար կարող ենք վերցնել $_GET կամ $_POST սուպերգլոբալների քննարկման ժամանակ դիտարկված օրինակները և մի փոքր ձևափոխել։
Կրկին ստեղծենք երկու ֆայլ՝ index-request.html և index-request.php:
Առաջին ֆայլում գրենք վերը նշված օրինակներից որևէ մեկի HTML ֆայլում գրվածը (ես կգրեմ $_POST-ում քննարկված օրինակի HTML-ը, սակայն Դուք կարող եք վերցնել մյուսը (իհարկե փոխելով action-ը))․
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> </head> <body> <form action="./index-request.php" method="POST"> First Name: <input type="text" name="first_name" /><br /> Last Name: <input type="text" name="last_name" /><br /> <button type="submit" name="submit">Submit</button> </form> </body> </html>
Երկրորդ ֆայլում գրենք հետևյալը․
<?php if (isset($_REQUEST['submit'])) { echo 'First Name: ' . $_REQUEST['first_name'] . '<br />'; echo 'Last Name: ' . $_REQUEST['last_name']; } ?>
Եթե ուշադրություն դարձնենք, ապա կտեսնենք, որ գրված է նույնը, ինչ $_GET-ի և $_POST-ի քննարկման ժամանակ դիտարկված օրինակներում, միայն այն տարբերությամբ, որ $_GET-ի կամ $_POST-ի փոխարեն գրված է $_REQUEST:
Այս սուպերգլոբալը միշտ հասանելի է, սակայն միշտ չէ, որ նրանում առկա են տվյալներ։ Որպեսզի այն դատարկ չլինի՝ պետք է, որ այդ ֆայլին ուղարկված լինեն տվյալներ GET, POST մեթոդներով կամ COOKIE-ով։
Սակայն պետք չէ հույս դնել այս սուպերգլոբալի վրա։ Ավելի լավ է օգտագործեք յուրաքանչյուր դեպքի համար նախատեսված սուպերգլոբալը ($_POST-ը POST մեթոդով եկած տվյալների համար, $_GET-ը՝ GET-ի համար, իսկ $_COOKIE-ն՝ COOKIE-ների համար)։
$_ENV
Այս սուպերգլոբալը զանգված է, որի մեջ առկա են արտաքին միջավայրից կոդին փոխանցված փոփոխականները։
Այդ արժեքները ներմուծվում են PHP-ի անունների գլոբալ տիրույթ արտաքին միջավայրի համակարգային փոփոխականներից, որտեղ գործարկված է PHP-ի վերլուծիչը (parser): Զանգվածի պարունակության ամբողջական և կոնկրետ ցուցակ գոյություն չունի։ Այն պարզելու համար ուսումնասիրեք Ձեր հրամանային տիրույթի մասին փաստաթղթերը։ Պետք է նշեմ, որ այս սուպերգլոբալը շատ քիչ է օգտագործվում։
Որևէ հարց ունենալու դեպքում կարող եք գրել մեկնաբանություններում։
Շնորհակալություն մեր բլոգից օգտվելու համար։