ќбъектно-ориентированное программирование на 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-2023г.

ƒелитесь с друзь€ми в соцсет€х. јктивные комментаторы получают свежие скрипты и бесплатные доработки от WR-Script.ru!

¬ернутьс€ к стать€м помощи WEB-мастеру

WR-–°—З—С—В—З–Є–Ї