Самостоятельное создание сайта
Самостоятельная раскрутка и продвижение сайта

Парадигма ООП в php

   Объектно-ориентированное программирование (далее по тексту - ООП) имеет очень древние корни, которые прорастали еще на языках программирования "низкого" уровня. На сегодня эта концепция считается самой оптимальной для построение сложных систем. Суть такой системы лежит в использовании отдельных объектов взаимосвязанных между собой. ООП очень напоминает конструктор - кубики различных форм и свойств складываются в сложную фигуру.
   В программировании ООП в php предоставляет отдельные части кода в виде объектов с уникальными свойствами. Взаимодействие этих объектов создает сложную систему, такую как: сайт, портал или интернет-магазин. PHP версии 5.x.x имеет все необходимое для создания полноценной ООП структуры. Основной единицей здесь выступает класс, а объектом - экземпляр класса.
   Классы и объекты появляются в результате планирования и разбиения проекта на отдельные абстракции. Абстракция - выделение некой предметной области, по ее характеристикам, свойствам и назначению. Грубо говоря, абстракция это те же объекты на которые мы разбиваем проект, например: меню, новости, блок каталога, прогноз погоды. В свою очередь абстракции могут состоять из других абстракций, например: меню горизонтальное и вертикальное, новости мира и Украины, прогноз погоды вмещает температуру, давление, пиктограммы погоды.

   В этой статье я постараюсь создать в PHP модель архитектуры ООП, согласно принципов ООП, как пример для планирования и построения сложных систем при веб разработке.
   Парадигма ООП это стандарт создания как небольшой части системы та и системы в целом, которая позволяет команде разработчиков планировать и решать параллельно отдельные задачи на основе общего подхода к созданию и проектированию, что позволяет легко связывать разработанные компоненты и создавать целостную прозрачную систему доступную для модифицирования и понимания всеми разработчиками.

   К основным группам принципов в ООП можно отнести:

   - абстрагирование, абстракция, модульность;
   Эта группа отвечает обобщает самостоятельность объекта и связывает воедино все, что связано абстракцией объекта. Например это может быть корзина в интернет-магазине, блок комментариев, блок поиска и т.д. В свою очередь, например корзина интернет-магазина может состоять из доставки, расчет цены товаров и скидок. Модульность позволяет связать все классы и объекты в отдельный модуль "корзина". Модульность это более глобальное абстрагирование.

   - инкапсуляция;
   Инкапсуляция позволяет вложить все алгоритмы и расчеты связанные с какой-то абстракцией в отдельный класс, которые могут быть доступными или закрытыми для использования за пределами класса или потомками класса.

   - наследование, иерархия, полиморфизм.
   Наследование класса - очень важное свойство класса передавать методы, алгоритмы или просто значение от класса родителя к классу потомку, добавляя его возможности. Благодаря наследованию классы могут выстраиваться иерархически и взаимодействовать между собой. Иерархия позволяет создать дерево классов и обычно проектируется на стадии планирования. Полиморфизм - свойство потомка класса заменять выбранные методы и алгоритм класса родителя своими. Полиморфизм позволяет создавать клоны класса родителя, но с измененными свойствами.

   Давайте создадим иерархию классов и посмотрим, как они будут взаимодействовать между собой. Все глобальные абстракции разделим на модули.
   Припустим, что нам необходимо создать самостоятельный модуль, который будет отвечать за все, что связано с работниками фирмы. Основными функциями модуля будет выдача информации о работниках, в том числе:
   - об отработанном времени;
   - их уровне образования;
   - персональные данные;
   - автомобилях работников и т.д.
   Посмотрите на рисунок ниже.

 


   На изображении спроектирован модуль Worker. Модуль состоит из классов непосредственно связанных с обработкой информации по работникам (class Persons, class WorkTime, class Education, class Cars и class WorkerCars) и дополнительных классов (abstract class ModWorker - ответственный за связь модуля с окружающей средой (сцепление), другими классами или модулями; class Worker - конструкторский класс объединяющий все объекты классов модуля, в результате этот класс порождает супер объект obj_worker обладающий всеми свойствами модуля).
   Начинается модуль с абстрактного класса. Основное его назначение это связь с другими модулями или классами (сцепление). Сцепление осуществляется через создание объектов внутри абстрактного класса. Кроме этого абстрактный класс может принадлежать к специальному интерфейсу. Это будет гарантировать, что класс имеет необходимые связи и находится в актуальном состоянии.

   Теперь можно глянуть на содержимое модуля:
 

abstract class ModWorker implements Interface1 {
   protected $objMysql;
   //создаем объект класса ответственного за связь с базами данных Mysql
   function __construct (Mysql $mysql) {//создаем объект класса Mysql
      $this->objMysql = $mysql;
   }
}

Обратите внимание на то, как создают объекты внешних классов внутри класса.

class Persons extends ModWorker{
   private $table = "workers";
   protected $first_name;
   protected $work_telefon;
   protected $home_adress;
   // Подключаемся к mysql данные пользователя по его id
   function get_worker_data($id_worker) {
      $id = (int) $id;
      if (empty($id)) return 0;
      if ($res = $this->objMysql->query("SELECT * FROM ".$this->table." WHERE `id`='".$id."'")) {
         $row = mysql_fetch_assoc($res);
         $this->first_name = $row["first_name"];
         $this->work_telefon = $row["work_telefon"];
         $this->home_adress = $row["home_adress"];
      }
   }
}

class WorkTime extends Persons{
   protected $work_time_week;
   protected $work_time_mounce;
   // Получаем данные по отработанному времени работника
   function calculate_time($id_worker) {
      //...
   }
}

class Education extends Persons{
   protected $MBA;
   protected $school_graduate;
   // Получаем данные по образованию работника
   function get_worker_education($id_worker) {
      //...
   }
}

class Cars extends ModWorker{
   protected $type_car;
   protected $STO;
   // Получаем технические характеристики машины
   function atrribute_car($id_car) {
      //...
   }
}

class WorkerCars extends Cars{
   protected $worker_car;
   protected $time_work_car;
   //Получаем информацию по машине работника
   function get_worker_car_info($id_worker) {
      //...
   }
}

class Worker {
   private $objWorkTime;
   private $objEducation;
   private $objWorkerCars;
   private $objCars;
   private $objPersons;
   //создаем супер объект из объектов модуля
   function __construct () {
      $this->objWorkTime = new WorkTime();
      $this->objEducation = new Education();
      $this->objWorkerCars = new WorkerCars();
      $this->objCars = new Cars();
      $this->objPersons = new Persons();
   }
}
$objWorker = new Worker();

   В этом примере мы создаем иерархию классов, а потом на ее основе необходимые нам объекты с нужными и полезными свойствами. Очень важной задачей программиста это правильно определить абстракции и выделить их в объект. Каждый класс отвечает за уникальную абстрактную функцию, но не берет на себя больше, чем ему отводиться.
   Важную роль ООП в php имеют и интерфейсы. По своему виду они напоминают еще более урезанный абстрактный класс.

interface DB { //функции для связи с базой данных
   function link_mysql();
   function modify_DB();
}
interface file_system { //функции для работы с файловой системой
   function create_file();
   function delete_file();
}
abstract class ModWorker implements DB, file_system {//класс имеет реализацию всех функций подключеных интерфейсов

   Наличие интерфейса означает, что в данном классе существует реализация общедоступных универсальных функций. Например, как в примере выше, наличие DB, file_system означает, что в классе реализуется функции для работы с файловой системой и с базой данных.

   Результатом статьи получился вот такой вот небольшой пример, в котором я постарался раскрыть один кубик из которых строится система. ООП требует немного больше времени на разработку и планирование. Особенно важно все правильно спланировать заранее. Естественно довольно сложно охватить всю разработку в целом. Но основным преимуществом ООП и есть разработка автономных объектов.
   Данная парадигма ООП в php не является идеальной. Для ее создания мне пришлось перечитать материалы по ООП. В частности для более глубокого понимания принципов ООП, я бы порекомендовал Вам перечитать книгу Гради Буча "Объектно-ориентированный анализ и проектирование". Мое субъективное понимание ООП, позволило создать, на мой взгляд, универсальную парадигму ООП которая может разделить задачи на параллельное создание компонентов, с минимальными затратами объединить их и соблюсти все принципы ООП. Если у Вас есть другое мнение и большой опыт ООП, то возможно Вы поделитесь знаниями, чем бы я мог еще дополнить эту статью.

895
2.8 41
Рейтинг: +2.8 , голосов 41
Вы еще не голосовали!
Добавить комментарий (комментариев: 5)
Удалить ответ

Ваш почтовый ящик никогда не будет опубликован
Трудно разобрать цифры? Нажмите на рисунок, чтобы обновить.
#1 19/02/2012 11:37 Alex
reply
А целесообразно использовать в классе Persons if ($res = $this->objMysql->query("SELECT * FROM ".$this->table." WHERE `id`='".$id."'"))...?
#2 01/11/2011 14:35 std
reply
Код плохо комментирован для учебного
#3 13/09/2011 17:34 Виталий
reply
Хорошая статья, спасибо! :) Вопрос: может, создание объекта $this->objCars = new Cars(); было лишним? Мы же всё равно создаём его потомка $this->objWorkerCars = new WorkerCars();
14/09/2011 14:57 admin
ну, если учесть что обращаться к методам класса Cars() через экземпляр objWorkerCars, тогда можно сказать, что лишнее
#4 28/06/2011 12:04 int21h
reply
Просто, доступно и наглядно
#5 08/09/2010 03:19 Алексей
reply
Спасибо, отличная статья! P.S. mounce?

Дополнительно

» С чего начать сайт?

» Установка программ

» Пример создания сайта

» Хостинг и домен

» Оптимизация сайта

» Раскрутка сайта

» Заработок web-мастера

» Примеры PHP/Javascript

» Блог и мои записки

Последние новости

Статьи по рейтингу

» Особенности покупки контента 5.0 1
» Выбор хостинга 4.8 5
» Поисковые системы 4.7 9
» Курс молодого web-мастера 4.6 21
» Где взять бесплатные ссылки 4.5 11
» Что такое сниппеты 4.5 6
» Addstudio - SEO модуль 4.5 4
» Отладка js и CSS 4.4 14
» Стратегия дохода на Sape.ru 4.3 3
» Каталоги и биржи статей 4.3 4