PHP успадкування - public, protected, private

успадкування

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

Клас, який виходить внаслідок успадкування від іншого, називається підкласом. Цей зв'язок зазвичай описують за допомогою термінів «батьківський» та «дочірній». Дочірній клас походить від батьківського і успадковує його характеристики: властивості та методи. Зазвичай, у підкласі до функціональності батьківського класу (який також називають суперкласом) додаються нові функціональні можливості.

Підклас успадковує доступ всім методам і властивостям батьківського класу, оскільки вони мають тип public . Це означає, що для екземплярів класу my_Cat ми можемо викликати метод add_age() і звертатися до властивості $age, незважаючи на те, що вони визначені в класі cat . Також у наведеному прикладі підклас немає свого конструктора. Якщо в підкласі не оголошено свого конструктора, то при створенні екземплярів підкласу автоматично викликатиметься конструктор суперкласу.

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

При виклик $kitty->foo() інтерпретатор PHP не може знайти такий метод у класі my_Cat , тому використовується реалізація цього методу задана в класі Cat . Однак у підкласі визначено власну властивість $age, тому при зверненні до нього в методі $kitty->foo() інтерпретатор PHP знаходить цю властивість у класі my_Cat і використовує його.

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

Ми можемо поводитися з екземпляром класу my_Cat так, як це об'єкт типу Cat , тобто. ми можемо передати об'єкт типу my_Cat методу foo() класу Cat і все буде працювати, як треба.

Оператор parent

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

Щоб викликати потрібний метод із батьківського класу, вам знадобиться звернутися до цього класу через дескриптор. Для цього в PHP передбачено ключове слово parent . Оператор parent дозволяє підкласам звертатися до методів (і конструкторів) батьківського класу та доповнювати їхню існуючу функціональність. Щоб звернутися до методу в контексті класу, використовуються символи "::" (двокрапки). Синтаксис оператора parent :

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

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

Ключове слово parent можна використовувати не тільки в конструкторах, але і в будь-якому іншому методі, функціональність якого ви хочете розширити, досягти цього можна, викликавши метод батьківського класу:

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

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

public, protected та private: управління доступом

До цього моменту ми явно оголошували всі властивості, як public (загальнодоступні). І такий тип доступу заданий за промовчанням всім методів.

Елементи класу можна оголошувати як public (загальнодоступні), protected (захищені) та private (закриті). Розглянемо різницю між ними:

  • Доpublic (загальнодоступних) властивостей та методів можна отримати доступ з будь-якого контексту.
  • Доprotected (захищеним) властивостям і методам можна отримати доступ або з класу, що містить їх, або з його підкласу. Ніякому зовнішньому коду доступу до них не надається.
  • Ви можете зробити дані класу недоступними для програми, що викликає, за допомогою ключового словаprivate (закриті). До таких властивостей та методів можна отримати доступ тільки з того класу, в якому вони оголошені. Навіть підкласи цього класу не мають доступу до таких даних.

public - відкритий доступ:

private - доступ лише з методів класу:

protected - захищений доступ:

Модифікатор protected з точки зору програми, що викликає, виглядає так само, як і private: він забороняє доступ до даних об'єкта ззовні. Однакна відміну від private він дозволяє звертатися до даних як з методів свого класу, але й з методів підкласу.