Êîäèíã PHP: ÎÑÍÎÂÛ ÎÑÍΠÍèêèòà «Nikitos» Êèñëèöèí (nikitoz@realxakepru) Äàâàé ðàññìîòðèì âçàèìîäåéñòâèå âåá-ñåðâåðà è êëèåíòà â òðèâèàëüíîì ñëó÷àå - ïðè èñïîëüçîâàíèè ñòàòè÷íîãî html’à Êëèåíò, íàïðèìåð IE, îòïðàâëÿåò ñåðâåðó çàïðîñ Òîò, ÷èòàÿ åãî, âûïîëíÿåò íåêîòîðóþ îïåðàöèþ - â ðàññìàòðèâàåìîì ñëó÷àå òóïî ÷èòàåò çàêà÷àííûé ðàíåå ôàéë è ïåðåäàåò åãî ñîäåðæèìîå áðàóçåðó Âñå ýòî, êîíå÷íî, çäîðîâî, íî âîò ïðîáëåìêà - î÷åíü óæ ãåìîðíî ðó÷êàìè ïðàâèòü õòìë-ôàéëû, ÷òîáû îáíîâèòü ñàéò - îñîáåííî åñëè ñàéòîâ ýòèõ ìíîãî Äëÿ ðåøåíèÿ èìåííî ýòîé ïðîáëåìû áûë ðàçðàáîòàí â 1994 ãîäó ÿçûê PHP - çàìå÷àòåëüíàÿ òåõíîëîãèÿ, âïîñëåäñòâèè èçáàâèâøàÿ webðàçðàáîò÷èêîâ îò öåëîé êó÷è îäíîîáðàçíîé ìåõàíè÷åñêîé ðàáîòû Âåñü ñìàê ýòîé òåõíîëîãèè çàêëþ÷àåòñÿ â òîì, ÷òî êàê òàêîâîãî html-ôàéëà íà ñåðâåðå íåò, åñòü ëèøü íåêîòîðîå ïðàâèëî, ïî êîòîðîìó ôîðìèðóåòñÿ ïîòîê âûâîäà áðàóçåðó Ýòè ïðàâèëà è íàçûâàþòñÿ ñêðèïòàìè (script - «ñöåíàðèé») Êîíöåïöèè PHPïðîãðàììèðîâàíèÿ PHP: îñíîâû îñíîâ «Ó òåáÿ åñòü ñàéò?» Êòî-òî, óñëûøàâ â ñâîé àäðåñ ïîäîáíûé âîïðîñ, îòâåòèò ñëîâàìè «íàôèã íàäî?» Êòî-òî äàñò ëèíê íà îäèíîêóþ html-ñòðàíèöó, íà êîòîðîé óæå íå ïåðâûé ãîä ïîñòèòñÿ óáîãîå «äîáðî ïîæàëîâàòü» È òîëüêî òû ÷åðåç ïàðó ëåò ñìîæåøü ãîðäî ñêàçàòü: «ß ñîäåðæó âîñåìü íîâîñòíûõ ïîðòàëîâ ñóììàðíîé ïîñåùàåìîñòüþ ìèëëèîí ÷åëîâåê â ñóòêè» Êðóòî? ß òîæå òàê äóìàþ Íî html òóò òåáå íå ïîìîùíèê - ãëóïî äåëàòü ñàéò ñòàòè÷íûì, îáíîâëÿÿ åãî ïî ftp :) Ìû ïîéäåì áîëåå ïðîãðåññèâíûì ïóòåì Íèêèòà «Nikitos» Êèñëèöèí (nikitoz@realxakepru) PHP - èíòåðïðåòèðóåìûé ÿçûê, òå ñöåíàðèè òðàíñëèðóþòñÿ â ìàøèííûå êîäû êàæäûé ðàç ïðè èõ âûïîëíåíèè Ôàéëû ñ php-êîäîì ìîãóò, â çàâèñèìîñòè îò íàñòðîåê web-ñåðâåðà, èìåòü ðàçëè÷íûå ðàñøèðåíèÿ Íåêîòîðûå àäìèíû äàæå ïðàêòèêóþò äàâàòü php-ñêðèïòàì íåñâîéñòâåííûå ÿçûêó ðàñøèðåíèÿ òèïà «htnl», «www» è òä - äåëàþò âñå, ÷òîáû äàòü áðàòó-õàêåðó êàê ìîæíî ìåíüøå èíôîðìàöèè î ñêðèïòå Íó, îíî è âåðíî, ÿ áû, ÷åñ ñëîâî, óâèäåâ ñêðèïò indexhtnl, íå ñðàçó áû äîãàäàëñÿ, íà êàêîì îí ÿçûêå íàïèñàí: òî ëè perl, òî ëè php, à ìîæåò è âîâñå python :) Íî îáû÷íî âñå æå ñêðèïòàì äàþòñÿ âïîëíå îïðåäåëåííûå ðàñøèðåíèÿ - php, php3/4, phtml è òï PHP ìîæåò áûòü óñòàíîâëåí ëèáî êàê ìîäóëü äëÿ web-ñåðâåðà, ëèáî - ýòî ïðàêòèêóåòñÿ ðåæå - â âèäå ñàìîñòîÿòåëüíîãî èíòåðïðåòàòîðà CGI (Common Gateway Interface) Ïðè èñïîëüçîâàíèè CGI âåðñèè âîçíèêàþò íåêîòîðûå íþàíñû ñ áåçîïàñíîñòüþ, íåñêîëüêî ñíèæàåòñÿ ñêîðîñòü âûïîëíåíèÿ ñöåíàðèÿ, íî åñòü è ïëþñ - ñóùåñòâóåò âîçìîæíîñòü ñîçäàâàòü php-ïðîöåññû ñ ïðàâàìè ðàçëè÷íûõ ïîëüçîâàòåëåé Ïðè èñïîëüçîâàíèè æå ìîäóëÿ âåáñåðâåðà âñå ïðîöåññû çàïóñêàþòñÿ ñ ïðàâàìè ñàìîãî âåáñåðâåðà - êàê ïðàâèëî, nobody PHP-êîä âñåãäà íà÷èíàåòñÿ ñî ñòðîêè Ñëåäóåò çàìåòèòü, ÷òî PHP-êîä ìîæíî âñòàâëÿòü â ïðîèçâîëüíîì ìåñòå html-äîêóìåíòà: êàê â ñàìîì åãî íà÷àëå, òàê è â ñåðåäèíå, â îáùåì, ãäå óãîäíî Êàê ñêàçàë êòîòî èç ðàçðàáîò÷èêîâ ÿçûêà: «PHP èñïîëüçóåòñÿ ëèøü òàì, ãäå îí äåéñòâèòåëüíî íåîáõîäèì» Ïðåäâèæó ãíåâ ïåðëîâùèêîâ è ïðîñòî íåäàëüíîâèäíûõ ëþäåé: «Ìåøàòü êîä ñ äèçàéíîì - òóïîñòü!» - âîñêëèêíóò îíè è áóäóò, êîíå÷íî æå, ïðàâû :) Íî âåäü äåëàòü ýòî òåáÿ íèêòî íå çàñòàâëÿåò - ýòî âñåãî ëèøü î÷åíü óäîáíàÿ äëÿ íåáîëüøèõ ñàéòîâ âîçìîæíîñòü  php åñòü ôóíêöèÿ include(), êîòîðàÿ ïðè ãðàìîòíîì èñïîëüçîâàíèè ïîçâîëÿåò ñîçäàâàòü ñëîæíåéøèå ïî ñâîåé ñòðóêòóðå ïðîåêòû, íå ìåøàÿ õòìë-òåãè ñ ïõï-êîäîì Ê ýòîìó ìû åùå âåðíåìñÿ â áóäóùèõ ìàòåðèàëàõ Âî âñåõ ïîñëåäóþùèõ ïðèìåðàõ ÿ áóäó îðèåíòèðîâàòüñÿ íà ìîäóëüíóþ óñòàíîâêó PHP - èáî âñòðå÷àåòñÿ îíà â 9999% ñëó÷àÿõ Îäíàêî äàæå åñëè òû íàòêíóëñÿ íà ñåðâåð, ãäå php ñòîèò òîëüêî êàê CGI èíòåðïðåòàòîð, òåáå áóäåò äîñòàòî÷íî ïîìåíÿòü ïåðâóþ ñòðîêó ñöåíàðèÿ íà ÷òî-íèáóäü òèïà #!/usr/bin/php, è ñöåíàðèé çàðàáîòàåò À òåïåðü ïåðåéäåì ê ðàññìîòðåíèþ îñíîâíûõ ôóíêöèé PHP Îñíîâíûå ôóíêöèè  ñòàðûõ âåðñèÿõ php ïåðåäàííûå ñêðèïòó ïåðåìåííûå èç html-ôîðìû (êàê âàðèàíò - ÷åðåç url) äîñòóïíû â ñöåíàðèè ñ èìåíàìè, êîòîðûå èìåëè ñîîòâåòñòâóþùèå ïîëÿ â ôîðìå Òå åñëè áûëî ïîëå name, òî îáðàòèòüñÿ ê ââåäåííûì â íåãî äàííûì ìîæíî ÷åðåç ïåðåìåííóþ $name  áîëåå ïîçäíèõ âåðñèÿõ, íà÷èíàÿ ñ 41, ñèòóàöèÿ íåñêîëüêî èçìåíèëàñü  äåôîëòíîé íàñòðîéêå PHP òåïåðü íå íàçíà÷àåò àâòîìàòè÷åñêè ïåðåìåííûå êàæäîìó èç ïîëó÷åííûõ ïîëåé, à ïîìåùàåò âñå ïîëó÷åííûå äàííûå â àññîöèàòèâíûå ìàññèâû: $_GET - ñîäåðæèò äàííûå, ïîëó÷åííûå ìåòîäîì GET $_POST - ñîäåðæèò äàííûå, ïîëó÷åííûå ìåòîäîì POST $_COOKIE - ñîäåðæèò äàííûå èç cookies $_REQUEST - ñîäåðæèò äàííûå, ïîëó÷åííûå èç âñåõ âîçìîæíûõ èñòî÷íèêîâ - GET, POST è cookies Ñëåäóåò, âèäèìî, ïîÿñíèòü, ÷òî ìàññèâ - ýòî, â îáùåì ñëó÷àå, ìíîæåñòâî íåêîòîðûõ ýëåìåíòîâ, êàæäûé èç êîòîðûõ èìååò ñâîé ñîáñòâåííûé óíèêàëüíûé èäåíòèôèêàòîð Âèçóàëüíî ìàññèâ ìîæíî ïðåäñòàâèòü ñåáå â âèäå øêàôà ñ êó÷åé ÿùè÷êîâ, íà äâåðöå êàæäîãî èç êîòîðûõ íàïèñàí íîìåð Îáðàòèòüñÿ ê ñîäåðæèìîìó êàêîé-òî ÿ÷åéêè ìîæíî, çíàÿ íîìåð äâåðöû è íàçâàíèå øêàôà Ïðåäïîëîæèì, ñóùåñòâóåò íåêèé ìàññèâ $array Òîãäà ññûëàòüñÿ íà åãî ýëåìåíòû ìîæíî ïóòåì óêàçàíèÿ èäåíòèôèêàòîðà ýëåìåíòà â êâàäðàòíûõ ñêîáêàõ, ó÷èòûâàÿ, ÷òî íóìåðàöèÿ ýëåìåíòîâ íà÷èíàåòñÿ ñ íóëÿ, òå íà ïåðâûé ýëåìåíò óêàæåò ïåðåìåííàÿ $array[0], íà âòîðîé - $array[1] Ñóùåñòâóþò òàêæå àññîöèàòèâíûå ìàññèâû, èäåíòèôèêàòîðîì ýëåìåíòîâ êîòîðûõ âûñòóïàåò íå öèôðà, à êàêîå-òî ñëîâî â àëôàâèòå [a-zA-Z0-9] Òåïåðü âåðíåìñÿ ê htmlôîðìàì Ïîñëå ïîëó÷åíèÿ íåêîòîðûõ äàííûõ ñðàçó ñîçäàåòñÿ ìàññèâ $_REQUEST, ýëåìåíòàìè êîòîðîãî ñëóæàò ââåäåííûå ïîëüçîâàòåëåì äàííûå Îáðàùàòüñÿ ê íèì ìîæíî, óêàçûâàÿ â êà÷åñòâå èäåíòèôèêàòîðîâ èìÿ ñîîòâåòñòâóþùåãî ïîëÿ â html-ôîðìå Íàïðèìåð, åñëè ïîëüçîâàòåëü îòïðàâèë ôîðìó ñ äâóìÿ ïîëÿìè: name è email, îáðàòèòüñÿ ê ñîäåðæèìîìó ýòèõ ïîëåé ìîæíî ÷åðåç ïåðåìåííûå $_REQUEST[name] è $_REQUEST[email] ñîîòâåòñòâåííî  PHP åñòü ÷åòûðå îñíîâíûõ òèïà äàííûõ: öåëîå ÷èñëî - integer, âåùåñòâåííîå ÷èñëî - double, ñòðîêà - string è áóëåâñêèé òèï - boolean Ïîñëåäíèé, ïî îïðåäåëåíèþ, ìîæåò ïðèíèìàòü òîëüêî äâà ëîãè÷åñêèõ çíà÷åíèÿ TRUE èëè FALSE Òèï äàííûõ â áîëüøèíñòâå ñëó÷àåâ ÿâíî óêàçûâàòü íå òðåáóåòñÿ - îí îïðåäåëÿåòñÿ â çàâèñèìîñòè îò çíà÷åíèÿ ïåðåìåííîé Òàê, $a = 1 - ýòî öåëûé òèï, $a = 032 - âåùåñòâåííûé, à $a = «Hey, nigga» - ñòðîêîâîé Ê ñòðîêàì ïðèìåíèìû âñå îïåðàöèè, ïðèìåíèìûå ê öåëûì è äåéñòâèòåëüíûì ÷èñëàì  PHP ìîæíî ñêëàäûâàòü, âû÷èòàòü, äåëèòü è óìíîæàòü ñòðîêó ñ äåéñòâèòåëüíûì ÷èñëîì Íàïðèìåð, åñëè óìíîæèòü $b=»It is 5 o’clock» íà $c=2, òî ïîëó÷èòñÿ 5*2=10 Ìîæíî, íî î÷åíü ðåäêî íóæíî, ÿâíûì îáðàçîì óêàçàòü òèï äàííûõ ïåðåìåííîé: Ïóñòü áûëà ïåðåìåííàÿ $var=314 - äåéñòâèòåëüíî ÷èñëî $var=(int) $var - öåëîå ÷èñëî, ðàâíîå òðåì $var=(string) $var - óæå ñòðîêà «3» Ôóíêöèÿ isset($var) ïîçâîëÿåò ïðîâåðèòü, ïðèñâîåíî ëè ïåðåìåííîé $var êàêîåëèáî çíà÷åíèå Åñëè ïðèñâîåíî, òî ôóíêöèÿ âîçâðàùàåò ëîãè÷åñêîå TRUE, â ïðîòèâíîì ñëó÷àå - FALSE  PHP åñòü óñëîâíûé îïåðàòîð IF, ïîçâîëÿþùèé âûïîëíÿòü ðàçëè÷íûå áëîêè êîäà â çàâèñèìîñòè îò íåêîòîðûõ óñëîâèé IF âû÷èñëÿåò áóëåâñêîå çíà÷åíèå 90
PHP êîä ñ÷åò÷èêà íåêîòîðîãî óòâåðæäåíèÿ Åñëè óòâåðæäåíèå âåðíî, òî âûïîëíÿåòñÿ êîä, íàõîäÿùèéñÿ â ñëåäóþùèì ñðàçó çà îïåðàòîðîì áëîêå {} Åñëè æå óòâåðæäåíèå îøèáî÷íî, òî âûïîëíÿåòñÿ áëîê else {} Íàïðèìåð:  PHP åñòü äâà òèïà öèêëîâ: while è for Ñèíòàêñèñ öèêëà while ÷ðåçâû÷àéíî ïðîñò: While(óñëîâèå) { _áëîê êîäà_ } Öèêë âû÷èñëÿåò çíà÷åíèå áóëåâñêîãî âûðàæåíèÿ, óêàçûâàþùåãîñÿ â êà÷åñòâå ïàðàìåòðà ê ôóíêöèè öèêëà Åñëè âûðàæåíèå false, òî êîä âíóòðè áëîêà {} èãíîðèðóåòñÿ, åñëè true, òî êîä âûïîëíÿåòñÿ Ïî äîñòèæåíèè } ïðîâåðÿåìîå âûðàæåíèå âû÷èñëÿåòñÿ çàíîâî, è âñå ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà îíî íå ñòàíåò íåâåðíûì Ñèíòàêñèñ öèêëà for íåñêîëüêî ñëîæíåå Îïåðàòîð for ïðèíèìàåò â êà÷åñòâå ïàðàìåòðîâ òðè âûðàæåíèÿ, ðàçäåëÿåìûõ òî÷êîé ñ çàïÿòîé Ïåðâîå ïðèñâàèâàåò íà÷àëüíîå çíà÷åíèå äëÿ ñ÷åò÷èêà öèêëà, âòîðîå âûðàæåíèå ÿâëÿåòñÿ áóëåâñêèì è âû÷èñëÿåòñÿ â íà÷àëå êàæäîãî ïðîõîäà ïî öèêëó Òðåòèé îïåðàòîð âûïîëíÿåòñÿ â ñàìîì êîíöå êàæäîé èòåðàöèè öèêëà è, êàê ïðàâèëî, ÷òî-òî äåëàåò ñ ïåðåìåííîé ñ÷åò÷èêà öèêëà, ïåðåîïðåäåëÿÿ íåêîòîðûì îáðàçîì åå çíà÷åíèå For ($i=0; $i