PHP Обектно ориентирано програмиране (ООП) концепция Урок с пример
Какво е OOPs?
Обектно ориентираният е подход към разработката на софтуер, който моделира приложението около обекти от реалния свят като служители, коли, банкови сметки и т.н. Класът дефинира свойствата и методите на обект от реалния свят. Обектът е поява на клас.
Трите основни компонента на обектната ориентация са;
- Обектно ориентиран анализ – функционалност на системата
- Обектно ориентирано проектиране – архитектура на системата
- Обектно ориентирано програмиране – реализация на приложението
Принципи на обектно ориентираното програмиране
Трите основни принципа на ООП са;
- Капсулирането – това се отнася до скриване на подробностите за изпълнението и само излагане на методите. Основната цел на капсулирането е да;
- Намалете сложността на разработката на софтуер – като скриете подробностите за внедряването и изложите само операциите, използването на клас става лесно.
- Защитете вътрешното състояние на обект – достъпът до променливите на класа е чрез методи като get и set, което прави класа гъвкав и лесен за поддръжка.
- Вътрешната реализация на класа може да бъде променена, без да се притеснявате за нарушаване на кода, който използва класа.
- наследяване – това се отнася до връзката между класовете. Връзката приема формата на родител-дете. Детето използва методите, дефинирани в родителския клас. Основната цел на наследяването е;
- Възможност за повторна употреба – няколко деца могат да наследят от един и същ родител. Това е много полезно, когато трябва да предоставим обща функционалност като добавяне, актуализиране и изтриване на данни от базата данни.
- полиморфизъм – това се отнася до наличието на един формуляр, но много различни начини за изпълнение. Основната цел на полиморфизма е;
- Опростете поддръжката на приложения и ги направете по-разширяеми.
ООП Concepts в PHP
PHP е обектно ориентиран скриптов език; поддържа всички горепосочени принципи. Горните принципи се постигат чрез;
- Капсулирането – чрез използването на методи „get“ и „set“ и др.
- наследяване – чрез използването на ключова дума extends
- полиморфизъм – чрез използването на ключова дума implements
Сега, когато имаме основни познания за ООП и как се поддържа в PHP, нека разгледаме примери, които прилагат горните принципи
Какво е UML?
Унифициран език за моделиране UML е техника, използвана за проектиране и документиране на обектно-ориентирани системи.
UML създава редица документи, но ние ще разгледаме диаграмата на класовете, която е много важна за обектно ориентираното php програмиране.
Пример за диаграма на клас
Ключ на диаграма на клас
- - Горна кутия съдържа името на класа
- - средна кутия съдържа променливите на класа
- - долна кутия съдържа методите на класа
- - минус (-) знак означава частен обхват
- - плюс (+) знак означава публичен обхват
- - хеш (#) знак означава защитен обхват
Как да създадете клас в PHP
Ключовата дума class се използва за дефиниране на клас в PHP. По-долу са правилата за създаване на клас в PHP.
- Името на класа трябва да започва с буква
- Името на класа не може да бъде PHP запазена дума
- Името на класа не може да съдържа интервали
Да кажем, че искаме да създадем клас за представяне на животни.
Ще започнем с идентифицирането на характеристиките, които са общи за всички животни.
- Всички животни принадлежат към семейство като тревопасни, карнавални и т.н.
- Всички животни ядат храна
Диаграмата по-долу показва диаграмата за животното
Нека сега кодираме нашия клас животни
<?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“ означава, че променливите не могат да бъдат достъпни директно извън класа (Encapsulation).
- „публична функция __construct($family…)“ е методът на php конструктора. Тази функция се извиква всеки път, когато е създаден екземпляр на класа. В този случай ние определяме семейството и храната.
- „обществена функция get…()“ е методът, използван за достъп до семейната или хранителната стойност (капсулиране)
- „обществен набор от функции…()“ е методът, използван за задаване на семейна или хранителна стойност (капсулиране)
Как да внедрим наследяването в PHP
Ще работим с крава и лъв. И кравата, и лъвът наследяват от класа Животни.
Класовата диаграма по-долу показва връзките.
Обърнете внимание, че кравата наследява от класа животни и също дефинира собствена променлива и методи.
Нека сега кодираме класа Крава
<?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); } } ?>
ТУК,
- „class … extends Animal“ кара кравата и лъва да използват методи от класа Animal (Наследяване).
Как да създадете обект от класа
Всички класове Animal, Cow и Lion трябва да са в една и съща директория за по-голяма простота.
Нека сега създадем приложението, което използва нашите класове.
Пример за PHP клас
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Canirval', '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(); ?>
Тестваме нашето приложение
Нека сега разгледаме нашето приложение в уеб браузър
Фантастично точно! Нека сега да разгледаме третия принцип на ООП, полиморфизма.
Да приемем, че искаме да разработим приложение, което се свързва с различни машини за бази данни, като напр MySQL намлява SQL Сървър, но използвайте същия унифициран интерфейс.
Можем да създадем интерфейс, който дефинира стандартните методи и абстрактен клас, който имплементира общите методи.
- Interface – подобно е на клас. Той само дефинира методите и параметрите.
- Абстрактен клас – това е клас, който не може да се използва за директно създаване на обект. Неговата цел е да предостави частични или пълни реализации на общи методи.
Диаграмата на класовете по-долу илюстрира връзката между нашите абстрактен клас, интерфейс и класове за изпълнение.
Нека сега създадем нашия абстрактен клас
<?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; } } ?>
ТУК,
- „абстрактен клас“ означава, че класът не може да се използва директно за php създаване на обект
- “$host,$db…” са променливи на класа, общи за всички реализации
- “function __construct(…)” е методът на конструктора на php клас, който задава стойностите на общите променливи при инициализация
Нека сега създадем интерфейса, който съдържа стандартните методи, които ще бъдат имплементирани по различен начин в зависимост от двигателя на базата данни.
<?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
- „… внедрява DBInterface“ гарантира, че класът предоставя стандартни методи, независимо от използвания драйвер на базата данни.
Използване на горния код Кодът, използващ горния клас, ще изглежда така
<?php $db = new MySQLDriver($host,$db,$uid,$password); ?>
Or
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
Останалата част от кода ще бъде една и съща и за двата драйвера, като например;
<?php $db->db_connect(); $db->insert($data); ?>
Oбобщение
- Обектно-ориентираното програмиране OOP е мощна техника, която моделира приложения след обекти от реалния свят
- Класът е представяне на обекти от реалния свят със свойства и методи
- Трите основни принципа на ООП са;
- Капсулирането
- наследяване
- полиморфизъм