Концепция за обектно-ориентирано програмиране (ООП) в PHP с пример
⚡ Умно обобщение
Обектно-ориентираното програмиране в PHP моделира приложение около обекти от реалния свят, използвайки класове и обекти. Това ръководство обяснява принципите на ООП за капсулиране, наследяване и полиморфизъм, как PHP ги поддържа и изгражда примери за работни класове, наследяване и интерфейси стъпка по стъпка.

Какво е OOPs?
Обектно-ориентираното програмиране е подход към разработката на софтуер, който моделира приложение около обекти от реалния свят, като служители, автомобили и банкови сметки. Класът дефинира свойствата и методите на обект от реалния свят. Обектът е екземпляр на клас.
Трите основни компонента на обектната ориентация са:
- Обектно ориентиран анализ – функционалност на системата
- Обектно-ориентиран дизайн – архитектура на системата
- Обектно ориентирано програмиране – реализация на приложението
Принципи на обектно ориентираното програмиране
Трите основни принципа на обектно-ориентирано програмиране (ООП) са:
- Капсулирането – това се отнася до скриване на детайлите на имплементацията и разкриване само на методите. Основните цели на капсулирането са:
- Намалете сложността на разработката на софтуер – като скриете подробностите за внедряването и изложите само операциите, използването на клас става лесно.
- Защита на вътрешното състояние на обекта – достъпът до променливите на класа се осъществява чрез методи като get и set. Това прави класа гъвкав и лесен за поддръжка.
- Позволете промяна на вътрешната имплементация на класа, без да се притеснявате за нарушаване на кода, който използва класа.
- наследяване – това се отнася до връзката между класовете. Връзката е под формата на родител и дете. Детето използва методите, дефинирани в родителския клас. Основната цел на наследяването е:
- Възможност за повторно използване – няколко деца могат да наследят от един и същ родител. Това е много полезно, когато трябва да осигурим обща функционалност, като например добавяне, актуализиране и изтриване на данни от базата данни.
- полиморфизъм – това се отнася до наличието на единен интерфейс с много различни реализации. Основната цел на полиморфизма е:
- За да се опрости поддръжката на приложенията и да се направят по-разширяемите.
ООП Concepts в PHP
PHP е обектно-ориентиран скриптов език; той поддържа всички гореспоменати принципи. Горните принципи се постигат чрез:
- Капсулирането – чрез използването на методи „get“ и „set“ и модификатори за достъп.
- наследяване – чрез използването на ключовата дума extends
- полиморфизъм – чрез използването на ключовата дума implements
Сега, когато имаме основни познания за ООП и как се поддържа в PHP, нека разгледаме примери, които прилагат горните принципи.
Какво е UML?
Унифицираният език за моделиране (UML) е техника, използвана за проектиране и документиране на обектно-ориентирани системи.
UML създава редица документи, но ние ще разгледаме диаграмата на класовете, която е много важна за обектно-ориентираното PHP програмиране.
Пример за диаграма на клас
Ключ на диаграма на клас
- - горна кутия съдържа името на класа
- - средна кутия съдържа променливите на класа
- - долна кутия съдържа методите на класа
- - минус (-) знакът означава частен обхват
- - плюс (+) знак означава публичен обхват
- - хеш (#) знак означава защитен обхват
Как да създадете клас в PHP
Ключовата дума class се използва за дефиниране на клас в PHP. По-долу са правилата за създаване на клас в PHP.
- Името на класа трябва да започва с буква
- Името на класа не може да бъде PHP запазена дума
- Името на класа не може да съдържа интервали
Да кажем, че искаме да създадем клас за представяне на животни. Ще започнем с идентифициране на характеристиките, които са общи за всички животни.
- Всички животни принадлежат към семейство, като например тревопасни, месоядни и др.
- Всички животни ядат храна
Диаграмата по-долу показва класовата диаграма за животното.
Нека сега кодираме нашия клас Animal.
<?php class Animal { private $family; private $food; public function __construct($family, $food) { $this->family = $family; $this->food = $food; } public function get_family() { return $this->family; } public function set_family($family) { $this->family = $family; } public function get_food() { return $this->food; } public function set_food($food) { $this->food = $food; } } ?>
ТУК,
- „private $family, $food“ означава, че променливите не могат да бъдат достъпни директно извън класа (капсулиране).
- „public function __construct($family…)“ е методът-конструктор на PHP. Тази функция се извиква всеки път, когато се създава екземпляр на класа. В този случай задаваме семейството и храната.
- „Публична функция get…()“ е методът, използван за достъп до стойността на семейството или храната (капсулиране)
- „public function set…()“ е методът, използван за задаване на стойността на семейството или храната (капсулиране)
Как да имплементираме наследяване в PHP
Ще работим с крава и лъв. И кравата, и лъвът наследяват от класа Животни.
Класовата диаграма по-долу показва връзките.
Обърнете внимание, че кравата наследява от класа Animal и също така дефинира своя собствена променлива и методи.
Нека сега кодираме класа Cow.
<?php class Cow extends Animal { private $owner; public function __construct($family, $food) { parent::__construct($family, $food); } public function set_owner($owner) { $this->owner = $owner; } public function get_owner() { return $this->owner; } } ?>
Нека сега кодираме класа Lion.
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
ТУК,
- „клас … разширява Animal“ кара класовете Cow и Lion да използват методи от класа Animal (наследяване).
Как да създадем обект от класа
Всички класове Animal, Cow и Lion трябва да са в една и съща директория за по-голяма простота.
Нека сега създадем приложението, което използва нашите класове.
Пример за PHP клас
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Carnivore', 'Meat'); echo '<b>Cow Object</b> <br>'; echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>'; echo '<b>Lion Object</b> <br>'; echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food(); ?>
Тестваме нашето приложение
Нека сега разгледаме нашето приложение в уеб браузър.
И двата обекта използват повторно методите get_family и get_food, наследени от класа Animal, което демонстрира наследяването в действие.
Как да имплементираме полиморфизъм в PHP
Да кажем, че искаме да разработим приложение, което се свързва с различни системи за бази данни, като например MySQL намлява SQL Сървър, но използва един и същ унифициран интерфейс. Можем да създадем интерфейс, който дефинира стандартните методи и abstract клас, който реализира общите методи.
- Interface – подобно е на клас. Той само дефинира методите и параметрите.
- Коремни мускулиtracТ-клас – това е клас, който не може да се използва за директно създаване на обект. Неговата цел е да предостави частични или пълни реализации на общи методи.
Диаграмата на класовете по-долу илюстрира връзката между нашите коремни мускулиtract клас, интерфейс и класове за имплементация.
Нека сега да си направим коремните мускулиtracт клас.
<?php abstract class DBCommonMethods { private $host; private $db; private $uid; private $password; public function __construct($host, $db, $uid, $password) { $this->host = $host; $this->db = $db; $this->uid = $uid; $this->password = $password; } } ?>
ТУК,
- коремни мускулиtrac„t клас“ означава, че класът не може да се използва директно за създаване на обект
- „$host, $db…“ са класови променливи, общи за всички реализации
- „function __construct(…)“ е методът-конструктор на класа, който задава стойностите на общите променливи при инициализацията
Нека сега създадем интерфейса, който съдържа стандартните методи, които ще бъдат имплементирани по различен начин в зависимост от използваната база данни.
<?php
interface DBInterface
{
public function db_connect();
public function insert($data);
public function read($where);
public function update($where);
public function delete($where);
}
?>
ТУК,
- „интерфейс“ е ключовата дума за създаване на интерфейси
- „обществена функция…(…)“ са стандартните методи, които трябва да бъдат приложени
Нека сега създадем конкретните класове, които ще разширят класа DBCommonMethods и ще имплементират интерфейса DBInterface. Първо, MySQLDriver.php:
<?php class MySQLDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
След това, MSSQLServerDriver.php:
<?php class MSSQLServerDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
ТУК,
- „клас … разширява DBCommonMethods“ използва методите в DBCommonMethods
- „… implements DBInterface“ гарантира, че класът предоставя стандартните методи, независимо от използвания драйвер на базата данни.
Кодът, използващ горните класове, би изглеждал така:
<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>
Или:
<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>
Останалата част от кода ще бъде еднаква и за двата драйвера, като например:
<?php $db->db_connect(); $db->insert($data); ?>
Това е полиморфизъм в действие: същите извиквания на методи работят върху всеки драйвер, който имплементира интерфейса, така че околният код никога не се променя, когато сменяте двигателите на базата данни.





