Класи. Об'єкти. Посилання.
Зміст
Клас та об'єкт
Клас - це якась структура даних і методів, яка дозволяє описати деякий об'єкт (до речі, об'єкт - це вже інше поняття). А якщо говорити простими словами, то можна привести наочний приклад.
Розглянемо автомобіль. У автомобіля є властивості і є функції, які він може виконувати. Серед властивостей можна виділити, наприклад, витрата палива, колір кузова, об'єм двигуна, тип кузова, тип коробки передач і т.д. Основні функції автомобіля - їхати вперед / назад, повернути ліворуч / праворуч і т.д.
Автомобіль ЗАЗ 968М - належить до класу легкових автомобілів. Або Subaru Forester - теж належить до класу легкових авто. Різниця між запорожцем і субару звичайно суттєва, але насправді вони мають багато спільного - ті ж колір кузова, розхід палива і т.ін. Тому ці дві контрастно-розрізняються машини можна виділити в один клас - клас легкових авто.
Ці дві машини є двома абсолютно різними об'єктами. Зрозуміло, що вони сильно розрізняються. І нехай у мене кине камінь той, хто зі мною не погодиться.
От я і навів приклад, що таке клас, а що таке об'єкт.
Властивості та методи
Тепер про те, як описується клас в PHP на прикладі опису класу автомобілів:
<? class Car { protected $bodyColor; // властивість «колір кузова» protected $fuelRate; // властивість «расход топлива» protected $engineVolume; // властивість «об'єм двигуна» public function accelerate() { // довавте галузь // … } public function slowdown() { // тормозити // … } } ?>
клас всіх автомобілів. Клас досить урізаний, але основа зрозуміла.
Модифікатори доступу
Тепер поговоримо про модифікатори доступу. Вони бувають трьох видів: public, protected і private.
public - значить, що властивість чи метод з таким модифікатором доступний ззовні класу скрізь, де програмісту захочеться. Цей модифікатор ставиться за замовчуванням, якщо не визначено іншого.
protected і private - означають, що метод або властивість є тільки всередині цього класу. protected і private розрізняються тільки у разі спадкування класів, про що ми поговоримо в окремій статті.
<? class MyClass { public function myMethod() { } protected function myMethod2() { } private function myMethod3() { } }
$obj = new MyClass; $obj->myMethod(); // можна $obj->myMethod2(); // ні! Помилка доступу $obj->myMethod3(); // ні! Помилка доступу ?>
Ключовим словом new я сказав PHP створити об'єкт класу MyClass і зберегти його у змінній $obj. Потім я спробував викликати відкритий метод myMethod і цей виклик у мене успішно спрацював. Потім я спробував звернутися до захищених методам класу myMethod2 і myMethod3, але пхп почав лаятись і перервав виконання скрипта. А навіщо тоді потрібні захищені методи, якщо їх не можна викликати?
Викликати їх насправді можна, тільки не ззовні класу, а всередині його:
<? class MyClass { public function myMethod() { $this->myMethod2(); $this->myMethod3(); } protected function myMethod2() { $this->myMethod3(); } private function myMethod3() { } } ?>
Те ж саме відноситься і до властивостей класу: звертатися до захищених властивостям можна тільки всередині самого класу або в класі-спадкоємця, якщо властивість не позначено як private.
Покажчик this
А що таке $ this? А це покажчик на самого себе. Він може використовуватися усередині самого класу, щоб звертатися до своїх же методам і властивостям.
Конструктори і деструктори
Будь-який об'єкт в PHP завжди створюється в пам'яті, а потім рано чи пізно знищується. За це відповідають спеціальні невидимі методи класу - конструктори і деструктори. Але невидимі вони тільки якщо ми їх самі не визначимо:
<? class MyClass { function __construct() { echo "Запущен конструктор"; } function __destruct() { echo "Запущен деструктор"; } } $obj = new MyClass(); // Виводить "Запущен конструктор" unset($obj); // Виводить "Запущен деструктор" ?>
Таким чином, ключове слово new створює новий об'єкт в пам'яті, викликаючи перед цим конструктор цього об'єкту, в якому можна присвоїти якимось властивостями об'єкта якісь значення або ще що-нитка корисне / потрібне зробити. Зауважу, що конструктор не може повертати значення, як звичайний метод класу, тобто return у нього писати не можна. Але конструктор може приймати параметри, чого не скажеш про деструктор, який повертати значення не може, і приймати параметри також не в змозі.
Інші елементи
В класі можуть бути і інші елементи, константи статичні елементи та ін.