Інкапсуляція, успадкування, поліморфізм (основи php - урок з курсу)

Інкапсуляція, успадкування, поліморфізм (основи php - урок з курсу)

У цьому уроці я розповім Вам про три основних поняттях Об'єктно-Орієнтованого Програмування: про інкапсуляцію, наслідування, поліморфізм; І навчу Вас застосовувати їх в розробці.

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

Іншими словами при роботі з грамотно спроектованих класом ми можемо користуватися тільки його методами, не вникаючи в те, як вони влаштовані і як вони працюють з полями класу. Йдеться про ситуації, коли ми працюємо з класом, розробленим іншими програмістами. Ми ж просто користуємося вже реалізованим функціоналом.

Наведемо ще один приклад. Принципи інкапсуляції як приховування внутрішньої реалізації закладені в будь-який функції PHP. Можливо, вам вже відома функція strpos () для роботи з рядками з стандартної бібліотеки PHP. Ця функція шукає в рядку задану послідовність символів і повертає її позицію у вигляді числа. Якщо задуматися над реалізацією цієї функції, то можна припустити, що нам буде потрібно в циклі переглядати кожен символ від початку рядка на збіг з початковим символом шуканої послідовності і в разі такого порівнювати такі два символу і т. Д. Але нам як програмістам немає необхідності замислюватися над цим і вникати в тонкощі реалізації даної функції. Нам досить знати параметри. які вона приймає, і формат, що повертається. Функція strpos () інкапсулює в собі рішення задачі пошуку підрядка, пропонуючи нам лише зовнішній інтерфейс для її використання.

Аналогічним чином правильно спроектовані класи приховують свою внутрішню реалізацію, надаючи зовнішнім користувачам інтерфейс у вигляді набору методів.

У мові PHP концепція інкапсуляції реалізована у вигляді спеціальних модифікаторів доступу до полів і методів класів. Про це ми поговоримо далі.

Спадкування - механізм об'єктно-орієнтованого програмування, що дозволяє описати новий клас на основі вже існуючого (батьківського), при цьому властивості і функціональність батьківського класу запозичуються новим класом.

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

Тепер припустимо, що нашій програмі потрібно працювати з конкретними геометричними фігурами. квадратами і трикутниками. в тому числі з їх геометричним становищем на площині. Очевидно, що опис трикутників і квадратів за допомогою класу Фігура буде недостатнім, тому що вона не зберігає інформацію про геометричному положенні. Тому нам потрібно ввести ще два класи: Квадрат і Трикутник. При цьому припустимо, що в нашій програмі нам також потрібні кольори і площі фігур. Ця ситуація якраз і вимагає використання успадкування. Тому що будь-який квадрат і трикутник в програмі свідомо є фігурою, т. Е. Має колір і площа. У той же час кожна фігура вимагає додаткових даних (крім кольору і площі) для свого опису, що вирішується введенням двох додаткових класів для квадратів і трикутників. які успадковуються від класу Фігура.

Це означає, що в класах Квадрат і Трикутник нам не доведеться повторно ставити поля кольору і площі. Досить вказати, що згадані класи успадковуються від класу Фігура.

Наведений код визначає клас NewsArticle як спадкоємця Article. Клас Article в свою чергу є батьківським для класу NewsArticle. Це означає, що поля і методи класу Article будуть також присутні в класі NewsArticle. і заново їх визначати не потрібно.

За допомогою успадкування можна вибудовувати цілу ієрархію класів, наслідуючи один від іншого. У той же час у будь-якого класу може бути тільки один батько:

Інкапсуляція, успадкування, поліморфізм (основи php - урок з курсу)

Іноді у нас може з'явитися необхідність перевизначити один з методів батьківського класу. Давайте ще раз наведемо реалізацію класу Article:

У наведеному коді використовується функція strftime (). яка дозволяє виводити дати в зручному вигляді. Для кращого розуміння коду ознайомтеся зі специфікацією цієї функції в довіднику. Для нас же зараз важливо, щоб ви звернули увагу на те, що клас NewsArticle. як і Article. визначає метод view (). Відповідно, всі об'єкти цього класу будуть використовувати метод view (). оголошений в класі NewsArticle. а не в Article.

У вас може виникнути питання: чому ж все-таки важливо перевизначити деякі методи замість того, щоб вводити нові методи у класів-нащадків? Розуміння цього прийде разом з розумінням наступної найважливішої концепції ООП.

Поліморфізм - взаємозамінність об'єктів з однаковим інтерфейсом.

Давайте розглянемо наступний приклад, який дає уявлення про суть поліморфізму:

У цьому рядку відбувається виклик методу Call () у об'єкта класу А. Як і визначено в функції Call () класу A. відбувається виклик методу Test (). Відпрацьовує метод Test () у об'єкта класу A. і на екран виводиться текст "Це клас А".

У цьому рядку відбувається виклик методу Test () у об'єкта класу B. Метод Test () класу B виводить на екран текст "Це клас В".

Нарешті, в останньому рядку відбувається виклик класу Call () у об'єкта класу В. Але в реалізації класу B ми не побачимо такого методу, а це значить, що він успадковується від класу A. т. К. Клас B - це нащадок класу A. що ж ми бачимо в реалізації методу Call () класу A. Наступний код:

Метод Call () викликає метод Test () того об'єкта, в якому знаходиться. Це означає, що відпрацює метод Test () об'єкта класу B. Саме цим пояснюється результат, виведений на екрані.

В цьому і полягає принцип поліморфізму. Класи можуть мати однакові методи. але різну їх реалізацію. Розробляючи код сценарію, ми можемо знати лише загальну для групи класів специфікацію їх методів, але не мати уявлення, екземпляр якого саме класу буде використовуватися в конкретний момент часу.

Поняття інкапсуляції, успадкування та поліморфізму можна назвати трьома китами ООП. Розуміння і грамотне застосування принципів цих концепцій - запорука успіху розробки із застосуванням ООП.