PHP: Ïåðåìåííûå è êîíñòàíòû
Àâòîð: | Àðòåìüåâ Ñåðãåé Èãîðåâè÷ |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
Ïåðåìåííàÿ - ýòî íåêàÿ ñóùíîñòü, ñîäåðæàùàÿ äàííûå. Åñëè òèï äàííûõ ýòî îáùåå îïèñàíèå ôîðìàòà õðàíèìûõ äàííûõ è ñïîñîáîâ ðàáîòû ñ íèìè, òî ïåðåìåííàÿ ïðåäñòàâëÿåò ñîáîé êîíêðåòíûé áëîê ïàìÿòè êîìïüþòåðà.  ýòîì áëîêå õðàíèòñÿ çíà÷åíèå ïåðåìåííîé, à îáðàòèòüñÿ ê áëîêó (è ê çíà÷åíèþ) ìîæíî ïî èìåíè ïåðåìåííîé.
 PHP èìÿ ïåðåìåííîé âñåãäà íà÷èíàåòñÿ ñî çíàêà äîëëàðà ($), çà êîòîðûì îáÿçàòåëüíî äîëæíà ñëåäîâàòü áóêâà, ïîñëå êîòîðîé ìîæíî èñïîëüçîâàòü áóêâû, öèôðû è çíàê ïîä÷¸ðêèâàíèÿ. Èìåíà ÷óâñòâèòåëüíû ê ðåãèñòðó ñèìâîëîâ, ò.å. ïåðåìåííûå $value, $Value, $VALUE è $VaLuE - ÷åòûðå ÐÀÇÍÛÕ ïåðåìåííûõ, õîòÿ èõ èìÿ è ÷èòàåòñÿ îäèíàêîâî.
Ïðèìåðû ñèíòàêñè÷åñêè ïðàâèëüíûõ èì¸í ïåðåìåííûõ:
<php $varName $name_19 $x_____________99887 $èâàí_èâàíû÷ ?>
Ïðèìåð íåêîððåêòíûõ èì¸í:
<php $1_name $_user_pass ?>
Åñòü îäíî îáùåå ïðàâèëî (äëÿ âñåõ ÿçûêîâ ïðîãðàììèðîâàíèÿ), êàñàþùååñÿ èìåíîâàíèÿ ïåðåìåííûõ. Ïðàâèëî î÷åíü ïðîñòîå: èìåíà âñåãäà äîëæíû áûòü îñìûñëåííûìè.
Ïðèìåð ïëîõî ÷èòàåìîãî êîäà
<php $x_1 = func1($b); $u1 = $x_1['param1']; $u2 = $x_1['param2']; $u3 = $x_1['param3']; ?>
Êðàòêîñòü, êîíå÷íî, ñåòñòðà òàëàíòà, íî æåðòâîâàòü ïðîñòîòîé âîñïðèÿòèÿ êîäà ðàäè åãî êîìïàêòíîñòè - íåðàçóìíî. Òåì áîëåå, ÷òî äëèíà èìåíè íèêàê íå âëèÿåò íà ïðîèçâîäèòåëüíîñü ñêðèïòà. Íî íå ñòîèò è âïàäàòü â ïðîòèâîïîëîæíóþ êðàéíîñòü - äàâàòü ïåðåìåííûì ñëèøêîì äëèííûå èìåíà. Åñëè èìÿ äîëæíî ñîñòîÿòü èç äâóõ è áîëåå ñëîâ - ÷àñòè èìåíè íóæíî âûäåëÿòü çàãëàâíûìè áóêâàìè èëè ðàçäåëÿòü ïîä÷¸ðêèâàíèÿìè. Íàïðèìåð, èìÿ $strusernameadndomain íàìíîãî ëó÷øå âîñïðèíèìàåòñÿ â âèäå $str_UserNameAndDomain.
Ïðèìåð õîðîøî ÷èòàåìîãî êîäà
<php $user_data = get_user_data($userInfo); $user_id = $user_data['user_id']; $user_login = $user_data['user_login']; $user_name = $user_data['user_name']; ?>
Ïåðåìåííûå áûâàþò äâóõ âèäîâ: îáû÷íûå ïåðåìåííûå (ïåðåìåííûå-çíà÷åíèÿ) è ññûëî÷íûå ïåðåìåííûå. Êëþ÷åâîå îòëè÷èå ìåæäó íèìè çàêëþ÷åíî â ñïîñîáå îáðàáîòêè äàííûõ. Ïðè ïðèñâîåíèè çíà÷åíèÿ îáû÷íîé ïåðåìåííîé ïðèñâàèâàåìîå çíà÷åíèå ïîëíîñòüþ êîïèðóåòñÿ, ò.å. ñîçäà¸òñÿ íîâûé áëîê ïàìÿòè, êóäà ïîìåùàåòñÿ êîïèÿ èñõîäíîãî çíà÷åíèÿ. Ïðè äàëüíåéøåé ðàáîòå âñå èçìåíåíèÿ áóäóò îòðàæàòüñÿ íà ýòîé êîïèè, à íå íà èñõîäíûõ äàííûõ.
Ññûëî÷íûå ïåðåìåííûå ðàáîòàþò èíà÷å. Ïðè ïðèñâîåíèè çíà÷åíèÿ ññûëî÷íîé ïåðåìåííîé êîïèðóþòñÿ íå äàííûå, à èíôîðìàöèÿ î òîì, ãäå îíà ëåæèò.  ðåçóëüòàòå ïîëó÷àåòñÿ, ÷òî ïåðåìåííàÿ óêàçûâàåò íà òîò æå áëîê, â êîòîðîì ëåæàò èñõîäíûå äàííûå. Òåïåðü åñëè èçìåíèòü çíà÷åíèå ññûëî÷íîé ïåðåìåííîé, òî èçìåíèòñÿ èñõîäíîå çíà÷åíèå.
Ðàññìîòðèì ïðèìåð:
Ïåðåäà÷à ïåðåìåííûõ ïî çíà÷åíèþ
<php // Ïðèñâîèì çíà÷åíèå 'Âàñÿ' ïåðåìåííîé $name $name = 'Âàñÿ'; $ref_name = $name; // Òåïåðü $ref_name ðàâåí $name // Èçìåíèì $ref_name $ref_name = "Ìåíÿ çîâóò $ref_name"; echo $ref_name; // $ref_name èçìåíèëàñü echo $name; // $name îñòàëàñü ïðåæíåé ?>
Ïåðåäà÷à ïåðåìåííûõ ïî ññûëêå
<php // Ïðèñâîèì çíà÷åíèå 'Âàñÿ' ïåðåìåííîé $name $name = 'Âàñÿ'; $ref_name = &$name; // Òåïåðü $ref_name ññûëàåòñÿ íà $name // Èçìåíèì $ref_name $ref_name = "Ìåíÿ çîâóò $ref_name"; echo $ref_name; echo $name; // $name èçìåíèëàñü îäèíàêîâî ñ $ref_name ?>
Ñòîèò îòìåòèòü, ÷òî ïî ññûëêå ìîæíî ïåðåäàâàòü òîëüêî ïåðåìåííûå, ò.å. ñëåäóþùèé êîä ïðèâåä¸ò ê îøèáêå:
<php $ref_name = &('Âàñÿ'); // íåëüçÿ, ò.ê. çíà÷åíèå 'Âàñÿ' íå ÿâëÿåòñÿ ïåðåìåííîé; ?>
Äëÿ ðàáîòû ñ ïåðåìåííûìè åñòü â PHP îñîáûå ôóíêöèè:
- isset() - ïðîâåðÿåò, áûëà ëè îáúÿâëåíà ïåðåìåííàÿ è îòëè÷àåòñÿ ëè å¸ çíà÷åíèå îò NULL;
- empty() - àíàëîã isset()
- unset() - âñòðîåííàÿ ôóíêöèÿ ÿçûêà, óäàëÿþùàÿ çíà÷åíèå ïåðåìåííîé è óäàëÿþùàÿ ñàìó ïåðåìåííóþ èç ñïèñêà äîñòóïíûõ ïåðåìåííûõ (óíè÷òîæàþùàÿ ïåðåìåííóþ).
<php $name = 'Èâàí Èâàíû÷'; if(isset($name)) { // Âûâîäèì ñîîáùåíèå ñ èìåíåì echo "Ìî¸ èìÿ: $name"; // óíè÷òîæàåì ïåðåìåííóþ unset($name); } else "Èìÿ åù¸ íå îïðåäåëåíî"; echo $name; // íè÷åãî íå âûâåäåò, // ò.ê. çíà÷åíèå ïåðåìåííîé $name // åù¸ íå îïðåäåëåíî // èëè ïåðåìåííàÿ óæå óíè÷òîæåíà ?>
Îáëàñòü âèäèìîñòè ïåðåìåííûõ
Î÷åíü âàæíàÿ õàðàêòåðèñòèêà ïåðåìåííîé - å¸ îáëàñòü âèäèìîñòè (îáëàñòü äåéñòâèÿ), ò.å. îïèñàíèå òîãî, èç êàêèõ ìåñò ïðîãðàììû (ñêðèïòà) ìîæíî ïðî÷èòàòü èëè èçìåíèòü å¸ çíà÷åíèå. Ñëåäóåò âñåãäà ïîìíèòü, ÷òî ïåðåìåííàÿ, îáúÿâëåííàÿ âíóòðè áëîêà ïðîãðàììû, âèäíà òîëüêî â ïðåäåëàõ ýòîãî áëîêà, à äëÿ òîãî, ÷òîáû îáðàòèòüñÿ ê ïåðåìåííîé, îáúÿâëåííîé ñíàðóæè áëîêà, íåîáõîäèìî å¸ îñîáûì îáðàçîì îáúÿâèòü.
Áëîêàìè ïðîãðàììû â äàííîì ñëó÷àå ÿâëÿþòñÿ "ñêðèïò", "ôóíêöèÿ" èëè "êëàññ". Íàïðèìåð:
<php $name = 'Âàñÿ'; // ïåðåìåííàÿ $name îáúÿâëåíà â áëîêå "ñêðèïò" // ôóíêöèÿ, äîáàâëÿþùàÿ ôàìèëèþ ê èìåíè function tryChengeName($family) { $fullName = $name . $family; echo 'Èìÿ âíóòðè ôóíêöèè: '.$fullName; } echo 'Èìÿ ÄÎ âûçîâà ôóíêöèè: '.$name; // ðåçóëüòàò: "Èìÿ ÄÎ âûçîâà ôóíêöèè: Âàñÿ" tryChengeName(' Èâàíîâ'); // ðåçóëüòàò: "" echo 'Èìÿ ÏÎÑËÅ âûçîâà ôóíêöèè: '.$name; // ðåçóëüòàò: "Èìÿ ÏÎÑËÅ âûçîâà ôóíêöèè: Âàñÿ" ?>
Âðîäå áû âñ¸ ïðàâèëüíî, íî - íå ðàáîòàåò. Ïî÷åìó? Ïîòîìó ÷òî åñëè ÿâíî íå ñêàçàòü, ÷òî ïåðåìåííàÿ $name âíóòðè ôóíêöèè - ýòî â äåéñòâèòåëüíîñòè ãëîáàëüíàÿ ïåðåìåííàÿ $name, òî èíòåðïðåòàòîð ñîçäàòü âðåìåííóþ êîïèþ ïåðåìåííîé ñ èìåíåì $name è ïóñòûì çíà÷åíèåì. À òàê êàê çíà÷åíèå ïóñòîå (íåîïðåäåë¸ííîå), òî è ðåçóëüòàò ñëîæåíèÿ ñòðîê áóäåò íåîïðåäåë¸í (ïóñò).
Èñïðàâèòü ïîëîæåíèå î÷åíü ëåãêî, äîñòàòî÷íî äîáàâèòü âñåãî îäíó ñòðîêó (âûäåëåíà æèðíûì øðèôòîì):
<php $name = 'Âàñÿ'; // ïåðåìåííàÿ $name îáúÿâëåíà â áëîêå "ñêðèïò" // ôóíêöèÿ, äîáàâëÿþùàÿ ôàìèëèþ ê èìåíè function tryChengeName($family) { global $name; // ÿâíî óêàçûâàåì, ÷òî íàäî // èñïîëüçîâàòü ãëîáàëüíóþ ïåðåìåííóþ. $fullName = $name . $family; echo 'Èìÿ âíóòðè ôóíêöèè: '.$fullName; } echo 'Èìÿ ÄÎ âûçîâà ôóíêöèè: '.$name; // ðåçóëüòàò: "Èìÿ ÄÎ âûçîâà ôóíêöèè: Âàñÿ" tryChengeName(' Èâàíîâ'); // ðåçóëüòàò: "Èìÿ âíóòðè ôóíêöèè: Âàñÿ Èâàíîâ" echo 'Èìÿ ÏÎÑËÅ âûçîâà ôóíêöèè: '.$name; // ðåçóëüòàò: "Èìÿ ÏÎÑËÅ âûçîâà ôóíêöèè: Âàñÿ Èâàíîâ" ?>
 äàííîì ïðèìåðå ïåðåìåííàÿ $name èìååò îáëàñòü âèäèìîñòè, ðàâíóþ âñåìó ñêðèïòó, à ïåðåìåííàÿ $fullName, îáúÿâëåííàÿ âíóòðè ôóíêöèè, èìååò îáëàñòü îïðåäåëåíèÿ ðàâíóþ ýòîé ñàìîé ôóíêöèè. Ýòî çíà÷èò, ïðè âûõîäå èõ ôóíêöèè ïåðåìåííàÿ $fullName áóäåò óíè÷òîæåíà, à âñå ïîïûòêè ïðî÷èòàòü å¸ çíà÷åíèå ïðèâåäóò ê îøèáêå.
Ïðèìåðû ðàáîòû ñ êëàññàìè ìû ðàññìîòðèì â ðàçäåëå "Êëàññû è íàñëåäîâàíèå".
Ïåðåìåííûå ïåðåìåííûå
Äà-äà, çäåñü íåò îøèáêè, èìåííî òàê (äâóìÿ ñëîâàìè) íàçûâàþòñÿ íåêîòîðûå ïåðåìåííûå â PHP. Ñìûñë â òîì, ÷òî òåêñòîâàÿ ÷àñòü èìåíè ïåðåìåííîé (ò.å. èìÿ áåç çíàêà äîëëàðà) ìîæåò ñàìà áûòü èìåíåì. Íàïðèìåð:
<php // îáúÿâëÿåì è èíèöèàëèçèðóåì // ïåðåìåííóþ $varVar $varVar = 'Âàñÿ'; // îáúÿâëÿåì è èíèöèàëèçèðóåì // ïåðåìåííóþ $$varVar, ò.å. $Âàñÿ $$varVar = 'Èâàíîâ'; echo "$varVar ${$varVar}"; // âûâåäåò Âàñÿ Èâàíîâ, ?>
Íàñòîÿòåëüíî íå ðåêîìåíäóåòñÿ ïîëüçîâàòüñÿ ïîäîáíûìè ïðè¸ìàìè áåç îñòðîé íåîáõîäèìîñòè. Êîä, íàïè÷êàíûé òàêèìè òðþêàìè, î÷åíü ñëîæíî ñîïðîâîæäàòü. Îñîáåííî ýòî âàæíî ïðè ðàáîòå ñ äàííûìè, ââîäèìûìè ïîëüçîâàòåëÿìè. Ãëàâíàÿ ïðè÷èíà ñëîæíîñòåé - íåÿâíûå çàâèñèìîñòè. Íàïðèìåð, ÷òî ñëó÷èòñÿ, åñëè âìåñòî èìåíè 'Âàñÿ' íàïèñàòü ÷òî-òî âðîäå "''""_;%//^q'"? Ïðàâèëüíî! Ñêðèïò â áîëüøèíñòâå ñëó÷àåâ íå ñìîæåò âûïîëíèòüñÿ! Ìîæíî, êîíå÷íî, äîáàâèòü êó÷ó ïðîâåðîê íà íàëè÷èå "íåïðàâèëüíûõ" ñèìâîëîâ, íî ïðîùå âîîáùå íå ïîëüçîâàòüñÿ òàêèìè òðþêàìè.
Êîíñòàíòû
Êîíñòàíòà - ýòî íåêàÿ íåèçìåííàÿ âåëè÷èíà. Êîíñòàíòà îáúÿâëÿåòñÿ îäíîâðåìåííî ñ èìåíåì è çíà÷åíèåì. Äëÿ îáúÿâëåíèÿ êîíñòàíòû ñëóæèò ôóíêöèÿ define(), à äëÿ îïðåäåëåíèÿ íàëè÷èÿ êîíñòàíòû (ò.å. áûëà îíà îïðåäåëåíà èëè íåò) - ôóíêöèÿ defined(). Èìÿ êîíñòàíòû ñòðîèòñÿ ïî òåì æå ïðàâèëàì, ÷òî è èìåíà ïåðåìåííûõ.
Ïðèìåðû êîíñòàíò:
<php // Ïðàâèëüíûå èìåíà define("DBServer", "localhost"); define("DBCatalog", "php_online"); define("DBUser", "root"); // íåïðàâèëüíûå èìåíà define("2pass", "userpass"); if(defined("DBServer")) echo DBServer; else echo "DBServer not defined"; ?>
Îòäåëüíûé âèä êîíñòàíò PHP - òàê íàçûâàåìûå "ìàãè÷åñêèå êîíñòàíòû". Ýòî ñèñòåìíûå êîíñòàíòû, çíà÷åíèå êîòîðûõ îïðåäåëÿåò è óñòàíàâëèâàåò èíòåðïðåòàòîð. Òàêèõ êîíñòàíò íåìíîãî:
- __LINE__ Ñîäåðæèò íîìåð òåêóùåé ñòðîêè â òåêóùåì ôàéëå.
- __FILE__ Ñîäåðæèò ïîëíîå èìÿ òåêóùåãî ôàéëà
- __FUNCTION__ Ñîäåðæèò èìÿ òåêóùåé ôóíêöèè.
- __CLASS__ Ñîäåðæèò èìÿ òåêóùåãî êëàññà.
- __METHOD__ Ñîäåðæèò èìÿ òåêóùåãî ìåòîäà òåêóùåãî êëàññà.
Ýòè êîíñòàíòû î÷åíü óäîáíû ïðè îòëàäêå, íî âî âñåõ äðóãèõ ñëó÷àÿõ èõ ëó÷øå íå èñïîëüçîâàòü, çàìåíÿÿ íà âûçîâû ñîîòâåòñòâóþùèõ ôóíêöèé.