Класи. Об'єкти. Посилання.

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

Клас та об'єкт

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

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

Автомобіль ЗАЗ 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 у нього писати не можна. Але конструктор може приймати параметри, чого не скажеш про деструктор, який повертати значення не може, і приймати параметри також не в змозі.

Інші елементи

В класі можуть бути і інші елементи, константи статичні елементи та ін.