Уроки PHP – Класи і введення в ООП
В останньому уроці категорії ми розглянули функції в PHP, однак, щоб рухатися далі в освоєнні мови PHP, потрібно вивчити ще одну важливу концепцію. Йтиметься про ООП або об’єктно-орієнтоване програмування. Об’єктно-орієнтоване програмування – це стиль програмування, який покликаний змусити вас думати про програмування як про реальний світ. В ООП ви працюєте з об’єктами, а не тільки з даними. Коли ви хочете створити новий об’єкт, ви робите це за допомогою класів.
Класи – це фундаментальна частина ООП. Думайте про клас, як про якийсь проект чи прототип. Він описує, яким буде об’єкт і що він може робити, містить доступні властивості і методи. Простим прикладом класу може бути будівля. Клас будівлі визначає особливості однотипної будівлі і те, як вона повинна функціонувати.
Використовуючи клас будівлі, ви можете створити нову бетонну будівлю, і вона буде новим об’єктом. В ООП цей об’єкт називається екземпляром класу. Класи і екземпляри можна порівняти з породами собак: собака – це клас, а кожна порода є екземпляром цього класу.
Класи в PHP
Давайте подивимося на класи. У PHP клас може містити змінні-члени. Ці змінні називаються властивостями. Вони використовуються для визначення характеристик об’єкта. Коли ви хочете визначити поведінку, ви використовуєте методи. Методи – це функції, по-іншому. Функція, оголошена всередині об’єкта, є методом. Інша назва, але це працює однаково.
Кожен клас повинен починатися з ключового слова class
. Після цього йде ім’я класу (назва). Допустиме ім’я класу має починатися з літери або нижнього підкреслення, після чого може йти будь-яка кількість букв, цифр або підкреслень. Після назви класу йдуть фігурні дужки {}
, всередині яких містяться властивості і методи, доступні в цьому класі.
Приклад класу:
<?php class nameOfClass { // тут властивості і методи класу }
Приклад класу Dog:
<?php class Dog { public $poroda; // властивості класу public $vik; public $mastb; public $name; // нижче метод (функція) класу public function getInfo() { echo "Порода собаки на ім'я $this->name – це $this->poroda. Вік собаки – $this->vik, а масть – $this->mastb."; } }
Примітка: ключове слово public
перед усіма властивостями і методом getInfo()
є специфікатором видимості. Це говорить про те, що властивість або метод можуть бути доступні з будь-якого місця в коді. Інші специфікатори видимості: private
і protected
. Про них ми поговоримо трохи пізніше.
Екземпляри класів
Коли ви створюєте новий об’єкт класу або його примірник, це називається «створенням екземпляру». Щоб створити екземпляр об’єкта класу, ви повинні використовувати ключове слово new
. Якщо ви хочете отримати доступ до властивостей і методів об’єкта або примірника, ви повинні використовувати конструкцію стрілки ->
. Якщо ви хочете привласнити значення властивості, використовуйте оператор присвоювання =
, як і в випадку зі змінною.
Давайте продемонструємо це на прикладі з собакою. Спочатку ми створили новий клас під назвою Dog
. Цей клас має декілька властивостей, таких як «vik», «poroda», «mastb», «name» і один метод «getInfo». Далі ми створюємо новий екземпляр цього класу під назвою $DogOvcharka
. Не забувайте про правила іменування змінних.
Після цього ми призначаємо конкретні значення всіх властивостей, які доступні в класі Dog
, і новому примірнику $DogOvcharka
. І, нарешті, ми будемо викликати метод getInfo()
в $DogOvcharka
, щоб отримати інформацію про цей новий екземпляр.
<?php class Dog { public $poroda; public $vik; public $mastb; public $name; public function getInfo() { echo "Порода собаки на ім'я $this->name – це $this->poroda. Вік собаки – $this->vik, а масть – $this->mastb."; } } // створення нового екземпляра класу Dog $DogOvcharka = new Dog(); // присвоєння нових значень властивостям об'єкта або примірника $DogOvcharka $DogOvcharka->poroda = "вівчарка"; $DogOvcharka->vik = "3 роки"; $DogOvcharka->mastb = "біла"; $DogOvcharka->name = "Рекс"; // викликаємо метод getInfo() $DogOvcharka->getInfo(); // Результат: Порода собаки на ім'я Рекс – це вівчарка. Вік собаки – 3 роки, а масть – біла. ?>
Класи та $this
Ви, мабуть, помітили, що ми використовували $this
в методі getInfo()
для доступу до всіх властивостей. $this
є псевдозмінною. Це посилання на об’єкт або клас, з яким ви працюєте в даний момент. Ви можете «перекласти» $this
в «цього об’єкта або класу». Іншими словами, $this->name
– це все одно, що сказати «властивість name
цього об’єкта або класу».
Класи і наслідуваність
Класи PHP можуть успадковувати властивості і методи іншого класу. Коли один клас успадковує властивості або методи іншого, він називається підкласом. Клас, від якого успадковується підклас, називається батьківським класом. Коли ви хочете, щоб один клас успадковував властивості або методи іншого, вам потрібно використовувати ключове слово extends
.
Давайте розглянемо простий приклад, щоб продемонструвати, як працює успадкування. Спочатку ми створимо клас Lyudina
. Цей клас буде містити ряд відкритих властивостей і один метод. Потім ми будемо використовувати extends
для створення двох підкласів під назвою Cholovik
і Zhinka
.
<?php // батьківський клас class Lyudina { public $name; public $age; public $isHuman = true; public function skazhiHello() { echo "Привіт, мене звати $this->name."; } } // підклас Cholovik, який успадковує батьківський клас Lyudina // успадкування властивостей $name, $age, $isHuman та skazhiHello // додавання властивості $pol class Cholovik extends Lyudina { public $pol = "чоловічий"; } // підклас Zhinka, який успадковує батьківський клас Lyudina // успадкування властивостей $name, $age, $isHuman і skazhiHello // додавання властивості $pol class Zhinka extends Lyudina { public $pol = "жіночий"; } // новий екземпляр підкласу Cholovik $ivan = new Cholovik(); // призначення нових значень доступним властивостями $ivan->name = "Іван"; $ivan->age = "35"; // виклик методу skazhiHello() $ivan->skazhiHello(); // результат: Привіт, мене звати Іван // новий екземпляр підкласу Zhinka $julya = new Zhinka(); // призначення нових значень доступним властивостями $julya->name = "Юлія"; $julya->age = "25"; // виклик методу skazhiHello() $julya->skazhiHello(); // результат: Привіт, мене звати Юлія ?>
Класи і видимість
Як ви вже знаєте, PHP включає в себе щось, що називається специфікатором видимості або типом видимості. Цей специфікатор визначає, як і звідки можна отримати доступ до конкретної властивості і методу. До цих пір ми використовували відкритий (public
). Це ключове слово вказує, що властивість або метод, з яким ви працюєте, доступні з будь-якого місця. Крім public
, є два інших специфікатори: protected
і private
. Специфікатор protected
робить властивості і методи доступними тільки всередині самого класу шляхом успадкування, а також для батьківських класів. Специфікатор private
робить властивості і методи доступними тільки для класу, який їх визначає. Пам’ятайте, що в PHP кожна властивість класу повинна мати тип видимості.
Для методів це працює трохи не так. Ви можете оголосити метод без будь-якого явного типу видимості. Коли ви зробите це, PHP автоматично оголосить цей метод як відкритий (public
). Давайте використовувати наведений вище приклад, щоб продемонструвати це. Ми додамо новий закритий метод isHuman
в батьківський клас Lyudina
. Потім ми спробуємо викликати цей метод з підкласів Cholovik
і Zhinka
. Обидва виклики приведуть до помилки:
<?php class Lyudina { public $name; public $age; public $isHuman = true; public function skazhiHello() { echo "Привіт, мене звати $this->name."; } private function isHuman() { echo "Особа на ім’я $this->name – людина: $this->isHuman"; } } class Cholovik extends Lyudina { public $pol = "чоловічий"; } class Zhinka extends Lyudina { public $pol = "жіночий"; } $ivan = new Cholovik(); $ivan->isHuman(); // Uncaught Error: Call to protected method Lyudina::isHuman() $julya = new Zhinka(); $julya->isHuman(); // Uncaught Error: Call to protected method Lyudina::isHuman() ?>
Інтерфейси в PHP
Припустимо, ви оголошуєте новий клас. Вам потрібно вказати список методів, які повинен реалізувати цей клас. Це саме те, що інтерфейс зробить для вас. Ви використовуєте його для вказівки списку методів, які повинен реалізувати якийсь клас. Ви можете визначити новий інтерфейс, використовуючи ключове слово interface
. Синтаксис інтерфейсу виглядає як синтаксис класу.
Як реалізується інтерфейс? Ви створюєте новий клас і використовуєте ключове слово implements
, за яким слідує ім’я інтерфейсу. Відразу після імені класу і перед відкриваючою фігурною дужкою. Запам’ятайте три речі. По-перше, сам інтерфейс не містить реалізації будь-якого методу. Це дозволяє кожному класу, який використовує інтерфейс, обробляти метод по-різному.
Давайте розглянемо один простий приклад, щоб проілюструвати, як працює інтерфейс. Ми створимо новий інтерфейс під назвою «LyudinaInterface». Цей інтерфейс буде містити публічний метод skazhiHello()
. Потім ми створимо два класи: Englishman
і Frenchman
. Обидва будуть реалізовувати «LyudinaInterface», але обидва будуть обробляти skazhiHello()
по-різному.
<?php // створення нового інтерфейсу interface LyudinaInterface { public function skazhiHello(); } // перший клас, який реалізує інтерфейс LyudinaInterface class Englishman implements LyudinaInterface { public function skazhiHello() { echo "Hello!"; } } // другий клас, який реалізує інтерфейс LyudinaInterface class Frenchman implements LyudinaInterface { public function skazhiHello() { echo "Bonjour!"; } } $john = new Englishman(); $john->skazhiHello(); // результат: "Hello!" $marcel = new Frenchman(); $marcel->skazhiHello(); // результат: "Bonjour!" ?>
Примітка: ім’я інтерфейсу не обов’язково має включати слово Interface. Ми використовували його тільки для того, щоб зробити код більш читабельним. Ви можете використовувати будь-яке ім’я для інтерфейсу, який ви хочете, використовуючи допустимі символи.
По-друге, один інтерфейс може успадковуватися іншим, як клас. Ви можете зробити це за допомогою ключового слова extends
. Третє, що потрібно пам’ятати, це те, що клас може реалізовувати більш одного інтерфейсу. Кількість інтерфейсів, які може реалізувати клас, не обмежена. Якщо ви хочете, щоб клас реалізовував кілька інтерфейсів, розділяйте їх комами.
<?php // створення першого інтерфейсу interface FirstInterface { public function foo(); } // створення другого інтерфейсу interface SecondInterface { public function bar(); } // створення третього інтерфейсу, використовуючи успадкування interface ThirdInterface extends SecondInterface { public function bazz(); } // клас, який реалізує перший і другий інтерфейс class FooBar implements FirstInterface, SecondInterface {} ?>
Ось і все на сьогодні! У наступних уроків ми будемо продовжувати поглиблене вивчення мови програмування PHP.