Объектно-ориентированное программирование (далее по тексту - ООП) имеет очень древние корни, которые прорастали еще на языках программирования "низкого" уровня. На сегодня эта концепция считается самой оптимальной для построение сложных систем. Суть такой системы лежит в использовании отдельных объектов взаимосвязанных между собой. ООП очень напоминает конструктор - кубики различных форм и свойств складываются в сложную фигуру.
В программировании ООП в 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 не является идеальной. Для ее создания мне пришлось перечитать материалы по ООП. В частности для более глубокого понимания принципов ООП, я бы порекомендовал Вам перечитать книгу Гради Буча "Объектно-ориентированный анализ и проектирование". Мое субъективное понимание ООП, позволило создать, на мой взгляд, универсальную парадигму ООП которая может разделить задачи на параллельное создание компонентов, с минимальными затратами объединить их и соблюсти все принципы ООП. Если у Вас есть другое мнение и большой опыт ООП, то возможно Вы поделитесь знаниями, чем бы я мог еще дополнить эту статью.