Саме важке в написанні статей з об’єктно-орієнтованого програмування для новачків — це знати, де зупинитися.

Об’єктно-орієнтоване програмування в WordPress – Спадкування. Частина I
Об’єктно-орієнтоване програмування в WordPress – Спадкування. Частина II

Є так багато тем для обговорення, що ми можемо почати повільно рухатися у напрямку сучасних технологій програмування, відхилившись, в кінцевому рахунку, від нашої первісної мети: озброїти новачків набором інструментів, стратегій та розумінням базових понять.

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

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

Тому я вирішив почати формувати цю серію двома статтями (з третьої, фінальною частиною в якості узагальнення), які служать переходом в наступну тему розробки для початківців PHP програмістів: Спадкування.

Знову ж, для тих, хто є більш досвідченим програмістом — спадкування не така вже важлива тема, однак, якщо ви новачок — тоді спадкування є одним з понять, яке легко зрозуміти, трохи складніше реалізувати (вірите чи ні), і яке може призвести до ще більшої плутанини, коли мова заходить про таких питаннях, як поліморфізм (про який ми поговоримо пізніше).

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

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

Тепер, коли ми намітили план нашої статті, давайте приступимо до роботи.

Визначення спадкування

На відміну від ряду інших термінів програмування, «спадкування» насправді є словом, яке дуже добре описує саму концепцію. З Вікіпедії:

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

Щодо зрозуміло, чи не так? Але думаю, можна капнути глибше.

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

Виходить, ідея, що стоїть за об’єктно-орієнтованому програмування, полягає в тому, щоб ми повинні моделювати об’єкти реального світу? Начебто так. Але як багато ви бачили фізично існуюче повідомлення в блозі?
Ось саме.

Я завжди намагаюся уявити речі в світлі чогось набагато більш відчутного, більш матеріального, що ближче до того, що ми будемо робити.

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

Давайте спробуємо так:

Спадкування — це механізм, при якому один клас служить в якості батьківської для дочірнього класу, що забезпечує ряд властивостей і методів, загальних для батьків, і для дитини; при цьому дитина має здатність вводити свої власні властивості.

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

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

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

Візуалізація спадкування

Перш ніж рухатися далі, давайте розглянемо на дуже простий діаграмі класів, як працює спадкування:

Зверніть увагу, що ми використовуємо три класи:

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

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

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

Термінологія класів

Як ми вже говорили раніше, існує ряд термінів, які ми використовували, і всі вони є ключовими для розуміння того, як різні частини спадкування працюють разом.

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

  • Батьківський клас, також згадується як базовий клас — це клас, від якого інші класи успадковують інформацію, як показано на ілюстрації вище. Будь батьківський клас підтримує набір властивостей і функцій.
  • Зверніть увагу, що деякі функції можуть бути недоступні в базовому класі для сторонніх класів, дочірніх класів або тільки в базовому класі.
  • Дочірній клас, зазвичай називається підкласом — це клас, який успадковує інформацію, дані та функціональність батьківського класу.
  • Ми розглянемо код в наступній статті, однак, зазначу, що доступ до даних здійснюється тільки в одну сторону. Тобто підкласи можуть отримати доступ до інформації у їх базовому класі, а базові класи не знають нічого про своїх підкласах.

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

Зазначу також, що в програмуванні, деяким розробникам хочеться ввести те, що називається «множинне спадкування», яке означає, що окремий клас може успадковувати властивості і методи від декількох класів.

Це не тільки обмежене у PHP, але й виходить за рамки обговорення даної статті.

А що щодо абстрактних класів?

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

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

Продовження слідує…

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

До зустрічі!

Переклад статті «Object-Oriented Programming in WordPress — Inheritance I» був підготовлений дружною командою проекту Сайтостроение від А до Я.