Îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå íà PHP

 íàøåì ìàãàçèíå ñåðòèôèöèðîâàííûé àâòîâåëþð âñåãäà â íàëè÷èè äëÿ áûñòðîé îòãðóçêè.

Äîëîé ïðîöåäóðíîå ïðîãðàììèðîâàíèå, äàåøü îáúåêòíî-îðèåíòèðîâàííîå! 2003-09-08
Àâòîð: Äìèòðèé Âåðåùàêà dmitry Ñòðàíèöû: [1]

Ïðîãðàììèñòû - íàðîä ëåíèâûé. Ïîýòîìó, êîãäà äåëî äîõîäèò äî ðàáîòû, îíè ñíà÷àëà èùóò â ñåòè êàêîé-íèáóäü ïðîãðàììíûé ïðîäóêò, êîòîðûé â òîé èëè èíîé ñòåïåíè óäîâëåòâîðÿåò èõ ïîòðåáíîñòè â ðåøåíèè ïîñòàâëåííîé çàäà÷è. Åñëè ïðîãðàììèñò ïèøåò ÷òî-òî íà PHP, òî îäíîé èç ïåðâûõ ñèñòåì, êîòîðûå îí íàéä¸ò, áóäåò PHP Nuke. Ïîèãðàâøèñü ñ íèì íåêîòîðîå âðåìÿ, ïðîãðàììèñò ïîíèìàåò, ÷òî âåùü, êîíå÷íî, õîðîøàÿ, íî ñëèøêîì óæ "êîðÿâî" íàïèñàííàÿ, òÿæåëî àäàïòèðóåìàÿ ê çàäà÷àì, îòëè÷íûõ îò web-ïîðòàëà, äà è ïåðåâîä íà ðóññêèé ÿçûê ñäåëàí ÷åëîâåêîì, èìåâøåì íå áîëåå òð¸õ î÷êîâ ïî âåëèêîìó ìîãó÷åìó.

Òåì íå ìåíåå, ïîäõîä ê õðàíåíèþ êîäà â òîì âèäå, êàê ýòî ðåàëèçîâàíî â PHP Nuke è îïèñàíî íà áîëüøîì êîëè÷åñòâå ñàéòîâ, ïîñâÿù¸ííûì PHP, êàæåòñÿ âïîëíå ëîãè÷íûì, äîñòóïíûì è ïðèåìëåìûì.

Îáùàÿ ñõåìà ýòîãî ïîõîäà, íàçûâàåìîãî "ìîäóëüíûì", òàêîâà: Ñóùåñòâóåò íåêèé ãëàâíûé ñêðèïò, íàïðèìåð index.php. Ýòîò ñêðèïò â íåêîì ïàðàìåòðå, íàïðèìåð, $module, ïðèíèìàåò èìÿ ìîäóëÿ, êîòîðûé îòäà¸ò áðàóçåðó êàêóþ-íèáóäü ñòðàíèöó. index.php âûãëÿäèò ïðèìåðíî òàêèì îáðàçîì:

<?
 include "config.php";
 if (!$module || !file_exists("modules/$module.inc.php")) {
 $module="default";
 }
 include "modules/$module.inc.php";
?>

Òèïè÷íûé "ìîäóëü" ïðè òàêîì ïîñòðîåíèè ñàéòà âûãëÿäèò òàê:

<?
 if (!eregi("index.php", $PHP_SELF)) { die ("Access denied"); }
 $page_title="..."; // óñòàíàâëèâàåì èìÿ ñòðàíèöû
 include "includes/header.php"; // ïîäêëþ÷àåì äèçàéí
 // íåêèé <a href="/php">php</a> - êîä, êîòîðûé ãåíåðèðóåò äàííóþ ñòðàíèöó
 include "includes/footer.php"; // ïîäêëþ÷àåì îñòàòêè äèçàéíà
?>
Âðîäå áû âñ¸ õîðîøî, îäíàêî åñòü íåêîòîðûå íî:
  1.  êàæäîì ìîäóëå íóæíî äåëàòü include çàãîëîâêà - èíà÷å íå ñìîæåì èçìåíèòü <title> è äðóãèå òýãè â íà÷àëå ñòðàíèöû.
  2. Â êàæäîì ìîäóëå íåîáõîäèìî äåëàòü
    if (!eregi("index.php", $PHP_SELF)) { die ("Access denied"); }
    - ÷òîáû íå âûçâàëè íàïðÿìóþ, ìèíîâàâ ðàçëè÷íóþ èíèöèàëèçàöèþ ïåðåìåííûõ, ïîäêëþ÷åíèå ê ÑÓÁÄ, include îáùèõ ôóíêöèé è ò.ä. â config.php. Õîòÿ, íà ñàìîì äåëå, òàêîé çàïðåò äåëàåòñÿ òðåìÿ ñòðî÷êàìè â .htaccess:
    <files *.php>
    deny from all
    </files>
    
  3.  êàæäîì ìîäóëå íàäî äåëàòü include íèæíåé ÷àñòè ñòðàíèöû - ïî òîé æå ïðè÷èíå, ÷òî è ï.1
  4. Ïðè ïðîãðàììèðîâàíèè ìîäóëåé ïðèõîäèòüñÿ ìíîãîêðàòíî âûçûâàòü îäíè è òå æå ïðîöåäóðû: ãåíåðàöèþ ìåíþ, íàâèãàöèè, áàííåðîâ, ãîëîñîâàíèé è ò.ä. Äàæå åñëè âñå ýòè ïðîöåäóðû áóäóò ñ êðàñèâûìè, ëåãêîçàïîìèíàåìûìè èìåíàìè, ñ íåáîëüøèì êîëè÷åñòâîì ïàðàìåòðîâ, áóäóò ñîäåðæàòü âñ¸ HTML-ôîðìàòèðîâàíèå âíóòðè ñåáÿ, òî âñ¸ ðàâíî êàæäûé ðàç ïðè íàïèñàíèè ìîäóëÿ íàäî áóäåò ïîñëåäîâàòåëüíî íàïèñàòü âûçîâû âñåõ ýòèõ ïðîöåäóð:
    <?
     PageNavigation(module params);
     PageLeftMenu(module params);
     // PHP-êîä, ãåíåðèðóþùèé êîíòåíò
     PageRelatedLinks(module params);
     PageNewsLinks(module params);
     PageVotes(module params);
     PageBanner(module params);
    ?>
    
  5. Äðóãèå íî, çàáûòûå êàê ñòðàøíûé ñîí
Òàêèì îáðàçîì, íàïèñàíèå íîâîãî ìîäóëÿ íà÷èíàåòñÿ ñ êîïèðîâàíèÿ òåêñòà ñòàðîãî ìîäóëÿ ñ ïîñëåäóþùèì èñïðàâëåíèåì áëîêà, îòâåòñòâåííîãî çà êîíòåíò.

Îäíàêî åñòü ñïîñîá èçáàâèòü ñåáÿ îò ýòîãî ìîíîòîííîãî, äëèòåëüíîãî è íèêîìó íå íóæíîãî ïðîöåññà - äëÿ ýòîãî íóæíî âñïîìíèòü î ñóùåñòâîâàíèè ÎÎÏ (îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ) è î òîì, ÷òî PHP î÷åíü íåïëîõî ýòî ñàìîå ÎÎÏ ïîääåðæèâàåò.

Äëÿ íà÷àëà ñîçäàäèì êëàññ - Web-ñòðàíèöó, â êîòîðîé îïèøåì âñå ôóíêöèè, èñïîëüçóåìûå ïðè ãåíåðàöèè íàøèõ ñòðàíèö:

class WebPage 
{
// åñëè èìÿ ôóíêöèè ñîâïàäàåò ñ èìåíåì êëàññà, òî îíà ñ÷èòàåòñÿ êîíñòðóêòîðîì
// ãîâîðÿ ïî-ðóññêè, îíà âûïîëíÿåòñÿ ïðè ñîçäàíèè îáúåêòà
 function WebPage()
 {
 $this->page_title="äåìî-ìîäóëü";
 }
 function PageHeader()
 {
 include "includes/header.inc.php";
 // â ýòîì ôàéëå âìåñòî <?=$page_title;?> íàäî áóäåò íàïèñàòü <?=$this->page_title;?>
 }
 function PageFooter()
 {
 include "includes/footer.inc.php";
 }
 function PageNavigation()
 {
 // Êîä äëÿ íàâèãàöèè
 }
 function PageLeftMenu()
 {
 // Êîä äëÿ ìåíþ â ëåâîé ÷àñòè ñòðàíèöû
 }
 function PageContent()
 {
 // Êîä, ãåíåðèðóþùèé êîíòåíò
 }
 function PageRelatedLinks()
 {
 // Êîä, ãåíåðèðóþùèé ññûëêè íà ñâÿçàííûå ðàçäåëû
 }
 function PageNewsLinks()
 {
 // Êîä, ãåíåðèðóþùèé áëîê íîâîñòåé
 }
 function PageVotes()
 {
 // Êîä, ãåíåðèðóþùèé áëîê ãîëîñîâàíèé
 }
 function PageBanner()
 {
 // Êîä, ãåíåðèðóþùèé áàííåð
 }
 function Run() 
// ô-ÿ Run ïîñëåäîâàòåëüíî âûçûâàåò âñå íåîáõîäèìûå 
// ìåòîäû êëàññà WebPage äëÿ ïîñòðîåíèÿ ñòðàíèöû
 {
 $this->PageNavigation();
 $this->PageLeftMenu();
 $this->PageContent();
 $this->PageRelatedLinks();
 $this->PageNewsLinks();
 $this->PageVotes();
 $this->PageBanner();
 }
}
?>
Òåïåðü, åñëè íàì íàäî ñäåëàòü, íàïðèìåð, ñòðàíèöó, êîòîðàÿ îòëè÷àåòñÿ îò ñòàíäàðòíîé òîëüêî áëîêîì êîíòåíòà, òî ìû ìîæåì îïðåäåëèòü íîâûé êëàññ, ïðîèçâîäíûé îò WebPage:
class CoolPage extends WebPage
{
// ïåðåîïðåäåëÿåì êîíñòðóêòîð, ÷òîáû èçìåíèòü èìÿ ìîäóëÿ
 function CoolPage()
 {
// âûçûâàåì êîíñòðóêòîð ðîäèòåëüñêîãî êëàññà - âäðóã îí ÷òî-òî ïîëåçíîå äåëàåò? ;)
 parent::WebPage();
 $this->page_title="Êðóòîé ìîäóëü";
 }
 function PageContent()
 {
 // âûâîäèì êîíòåíò
 }
}
åñëè íàì íà ñòðàíèöå íå íóæíû íîâîñòè, òî ìû îïðåäåëÿåì äðóãîé êëàññ:
class CoolPageWithoutNews extends CoolPage
{
// çäåñü ìû íå îïèñûâàåì ôóíêöèþ CoolPageWithoutNews 
// â ýòîì ñëó÷àå PHP àâòîìàòè÷åñêè âûçîâåò êîíñòðóêòîð ðîäèòåëüñêîãî êëàññà
// ñîîòâåòñòâåííî èìÿ íàøåé ñòðàíèöû áóäåò "êðóòîé ìîäóëü"
 function PageNewsLinks()
 {
 // òóò ïóñòî, ÷òîáû ññûëêè íà íîâîñòè íå âûâîäèëèñü
 }
}
è òàê äàëåå.

 ïðèíöèïå, åñëè ó âàñ ïîÿâëÿåòñÿ áîëüøîå êîëè÷åñòâî êëàññîâ, òî êîä êàæäîãî èç íè èõ òîæå ìîæíî ðàçìåñòèòü â îòäåëüíîì ôàéëå, îäíàêî ñëåäóåò ñëåäèòü çà òåì, ÷òîáû êëàññû, ó êîòîðûõ åñòü ïðîèçâîäíûå êëàññû, áûëè äîñòóïíû âñåãäà, èíà÷å PHP íå ñìîæåò ïîíÿòü, èç êàêîãî ôàéëà áðàòü êîä ðîäèòåëüñêîãî êëàññà.

Âîò ïðèìåð ôàéëà index.php, êîòîðûé ìîæåò âûñòóïàòü â êà÷åñòâå "ãëàâíîãî ôàéëà":

<?
 include "config.php";
 include "base_classes.php";
 if ($module && file_exists($file="modules/$module.inc.php")) {
// ïðîâåðÿåì, åñòü ëè ôàéë ñ "òåëîì" êëàññà
 include $file;
 }
 if (!class_exists($module)) {
// ïðîâåðÿåì, ÷òî êëàññ ñóùåñòâóåò
 $module="WebPage";
 }
 $page=new $module; // ñîçäà¸ì îáúåêò
 $page->Run(); // çàïóñêàåì ãåíåðàöèþ ñòðàíèöû
}
?>
Ïðèìå÷àíèå: íå ñìîòðÿ íà òî, ÷òî âåñü ïðèâåä¸ííûé âûøå êîä íè ðàçó íå çàïóñêàëñÿ, âûøåóêàçàííàÿ òåõíîëîãèÿ, ñ òîé ðàçíèöåé, ÷òî ïî÷òè âñÿ èíôîðìàöèÿ íàõîäèòñÿ â ÁÄ, ðåàëüíî ýêñïëóàòèðóåòñÿ, íàïðèìåð, íà ìî¸ì ñàéòå - dmitry.rsl.ru


Àâòîð: Äìèòðèé Âåðåùàêà
https://dmitry.rsl.ru/



Ïðè ïåðåïå÷àòêå èíôîðìàöèè äåëàéòå, ïîæàëóéñòà, ññûëêó íà íàø ñàéò (ëèáî ïîäåëèòüñÿ âêîíòàêòå, ãóãë+ èëè äåëèòåñü â îäíîêëàññíèêàõ ñòàòü¸é). Ñïàñèáî!

Èñòî÷íèê: www.wr-script.ru©, 2004-2026ã.

Äåëèòåñü ñ äðóçüÿìè â ñîöñåòÿõ. Àêòèâíûå êîììåíòàòîðû ïîëó÷àþò ñâåæèå ñêðèïòû è áåñïëàòíûå äîðàáîòêè îò WR-Script.ru!

Âåðíóòüñÿ ê ñòàòüÿì ïîìîùè WEB-ìàñòåðó

WR-Счётчик