Поліморфізм в обєктно-орієнтованому програмуванні на PHP

1

Від автора: вивчивши абстрактні класи та інтерфейси, ми з Вами плавно підійшли до другого основним принципом об’єктно-орієнтованого програмування на PHP, під назвою поліморфізм, який активно використовується в сучасних фреймворках і різних бібліотеках. Тому знати, а головне розуміти, що це повинен кожен розробник на PHP.

Отже, поліморфізм ООП на PHP – це підтримка декількох реалізацій на основі одного загального інтерфейсу. Якщо сказати трохи інакше, це взаємозамінність об’єктів реалізують один інтерфейс. Тепер давайте розглянемо зазначене твердження на прикладі.

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

Почнемо з того, що реалізуємо інтерфейс, який визначить каркас і загальна поведінка класів спадкоємців, які будуть його реалізувати.

Таким чином, ми з Вами визначили інтерфейс, а значить всі класи, які будуть його імплементувати, обов’язково повинні реалізувати метод save(), незалежно від функціоналу який буде описаний. Тобто інтерфейс як би вказує на деяку структуру класів спадкоємців, а отже, чітко визначається доступ до них. При цьому метод save(), повинен виконати безпосередню завдання, в нашому випадку – збереження інформації, певним способом.

Наступним етапом, давайте створимо класи, що реалізують вищевказаний інтерфейс.

class DbSave implements ISave {
public $db;
public function __construct() {
$this->db = new mysqli($host,$user,$pass,$db);
}
public function save($data) {
if($data) {
$query = «INSERT INTO post(title,text)
VALUES(‘».$data[‘title’].»‘,'».$data[‘text’].»‘)»;
$result = $this->db->query($query);
}
}
}
class FileSave implements ISave {
public function save($data) {
file_put_contents(‘file.txt’,$data);
}
}

Як Ви бачите створено два класу – тобто два механізму по збереженню якоїсь інформації, кожен з яких використовує певне сховище, а значить і логіку збереження. І кожен з них у будь-якому випадку реалізує метод save() інтерфейсу ISave. Відповідно для того, що б зберегти інформацію, використовуючи один із створених механізмів необхідно створити об’єкт відповідного класу і викликати на виконання метод save().

$obj = new DbSave(‘localhost’,’root’,»,’my_db’);
$obj->save(array(‘title’,’text’));

Точно так само якщо необхідно зберегти інформацію в файл.

$obj = new FileSave();
$obj->save(array(‘title’,’text’));

А тепер давайте подивимося на попередні два приклади – що між ними спільного? Перше, що кидається в очі – це метод save(), який викликається на виконання у кожного створеного об’єкта. Як раз в цьому і полягає суть поліморфізму на PHP – тобто використання одного і того ж коду (виклик методу save()) для об’єктів різних класів. У розглянутому прикладі ми можемо використовувати різну реалізацію, тобто механізми по збереженню інформації, але так чи інакше, для кожного з них досить викликати на виконання тільки метод save(), тобто метод, який заданий інтерфейс. Таким чином, для зміни реалізації певного функціоналу, в нашому випадку це механізм збереження інформації, достатньо лише створити об’єкт відповідного класу.

Таким чином, на обличчя взаємозамінність об’єктів, що реалізують один і той же інтерфейс. Звичайно, зазначений приклад – дуже простий, але так чи інакше він відмінно показує, що собою являє поліморфізм в об’єктно-орієнтованому програмуванні PHP . Більш детально зазначена особливість розглянуто в курсі Курс об’єктно-орієнтованого програмування (ООП PHP).

На цьому дана стаття завершена. Всього Вам доброго і вдалого кодування.