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