Home

Object

Клас - це шаблон або зразок, що описує змінні і функції для конкретного виду об'єкта.

Метод - це функція, визначена в класі.

Властивість (свойство) - це змінна, визначена в класі.

Екземпляр - це окремий приклад застосування класу. Створення нового екземпляра класу називається отриманням екземпляра об'єкта.

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

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

Зміст:

Приклад 5.10. Оголошення класу і перевірка об'єкта

    <?php
      $object = new User;
      print_r($object);

      class User {
        public $name, $password;
        function save_user() {
          echo "Сюда помещается код, сохраняющий данные пользователя";
        }
      }
    ?>
  

Результат виконання коду:

User Object ( [name] => [password] => )

Приклад 5.11. Створення об'єкта і взаємодія з ним

    <?php
      $object = new User;
      print_r($object);
      echo "<br>";

      $object->name = "Joe";
      $object->password = "mypass";
      print_r($object);echo "<br>";

      class User {
        public $name, $password;
        function save_user() {
          echo "Сюда помещается код, сохраняющий данные пользователя";
        }
      }
    ?>
  

Результат виконання коду:

User Object ( [name] => [password] => )
User Object ( [name] => Joe [password] => mypass )

Приклад 5.12 Копіювання об'єкта

    <?php
      $object1 = new User();
      $object1->name = "Alice";
      $object2 = $object1;
      $object2->name = "Amy";

      echo "object2 name = " . $object1->name . "<br>";
      echo "object2 name = " . $object2->name;

      class User {
        public $name;
      }
    ?>
  

Результат виконання коду:

object1 name = Amy object2 name = Amy

И $object1, и $object2 ссылаются на один и тот же объект, поэтому изменение свойства name, принадлежащего $object2, на Amy устанавливает такое же значение и для свойства, принадлежащего $object1.

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

Приклад 5.13. Клонування об'єкта

    <?php
      $object1 = new User();
      $object1->name = "Alice";
      $object2 = clone $object1;
      $object2->name = "Amy";

      echo "object2 name = " . $object1->name . "<br>";
      echo "object2 name = " . $object2->name;

      class User {
        public $name;
      }
    ?>
  

Результат виконання коду:

object1 name = Alice object2 name = Amy

Конструктори

При создании нового объекта вызываемому классу можно передать перечень аргументов. Они передаются специальному методу внутри класса, который называется конструктором и занимается инициализацией различных свойств

Пример 5.15. Создание метода-конструктора в PHP 5

    <?php
      class User {
        function __construct($param1, $param2) {
          //сюда вставляються інструкції конструктора
          public $username = "Guest";
        }
      }
    ?>
  

Деструктори в PHP 5

Еще одним нововведением в PHP 5 стала возможность создания методов-деструкторов. Эта возможность подходит для тех случаев, когда код ссылается на объект в последний раз или когда сценарий подошел к концу. В примере 5.16 показано, как создается метод-деструктор.

Пример 5.16. Создание в PHP 5 метода-деструктора

    <?php
      class User {
        function __destruct() {
          // Сюда помещается код деструктора
        }
      }
    ?>
  

Написання методів

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

Приклад 5.17. Використання в методі змінної $this

    <?php
      class User {
        public $name, $password;

        function get_password() {
          return $this->password;
        }
      }
    ?>
  

Метод отримання пароля - get_password - застосовує змінну $ this для доступу до поточного об'єкту, а потім повертає значення властивості password, що належить цьому об'єкту

Клас, визначений в прикладі 5.17, потрібно використовувати наступним чином:

    $object = new User;
    $object->password = "secret";
    echo $object->get_password();
  

Статичні методи в PHP 5

При роаботі в PHP 5 можна також визначити метод як статичний, що буде означати можливість його виклику в класі, але не в об'єкті. Статичний метод не має доступа до жодного з властивостей об'єкта.

Приклад 5.18. Створення статичного метода та доступу до нього

    <?php
      User::pwd_string();

      class User {
        static function pwd_string() {
          echo "Будь ласка, введіть свій пароль";
        }
      }
    ?>
  

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

Об'явлення свойств(властивостей)

Приклад 5.19. Неявне об'явлення свойства

    <?php
      $object1 = new User();
      $object1->name = "Alice";

      echo $object1->name;

      class User {}
    ?>
  

Такий код буде коректно працювати і виведе строку(рядок) Alice, так як PHP неявним чином об'явить змінну $object->name. Але це може призвести до помилок, тому що свойство name було об'явлено за межами класу, тому краще об'являти свойства в межах класа явним чином

Визначення констант всередині класу

    <?php
      Translate::lookup();

      class Translate {
        const ENGLISH = 0;
        const SPANISH = 1;
        const FRENCH = 2;
        const GERMAN = 3;
        //...

        Static function lookup() {
          echo self::SPANISH;
        }
      }
    ?>
  

До котстант можна звертатися напряму, за допомогою ключового слова self і оператора двойної двокрапки.

Статичні властивості і методи

В примере 5.18 было показано, что объявление представителей класса статическими делает их доступными и без создания экземпляров класса. Свойство, объявленное статическим, не может быть доступно непосредственно из экземпляракласса, но может быть доступно из статического метода

Пример 5.23. Определение класса со статическим свойством

    <?php
      $temp = new Test();
      echo "Test A: " . Test::$static_property . "<br>";
      echo "Test B: " . $temp->get_sp() . "<br>";
      echo "Test C: " . $temp->static_property . "<br>";

      class Test {
        static $static_property = "Это статическое свойство";

        function get_sp() {
          return self::$static_property;
        }
      }
    ?>
    

Результат виконання коду:

Test A: Это статическое свойство
Test B: Это статическое свойство
Test C:
В этом примере показано, что на свойство $static_property можно ссылаться напрямую из самого класса, используя в Test A оператор двойного двоеточия. Test B также может получить его значение путем вызова метода get_sp объекта $temp, созданного из класса Test. Но Test C терпит неудачу, потому что статическое свойство $static_property недоступно объекту $temp

Успадкува́ння (наслідування)

В прикладі 5.24 клас Subscriber об'являється підкласом User шляхом використання інструкції extends.

Приклад 5.24. Налідовання і розповсюджування класа

    <?php
      $object = new Subscriber;
      $object->name = "Fred";
      $object->password = "pword";
      $object->phone = "012 345 6789";
      $object->email = "fred@bloggs.com";
      $object->display();

      class User2 {
        public $name, $password;
        function save_user() {
          echo "Сюда помещается код, сохраняющий данные пользователя";
        }
      }

      class Subscriber extends User2 {
        public $phone, $email;
        function display() {
          echo "Name: " . $this->name . "<br>";
          echo "Pass: " . $this->password . "<br>";
          echo "Phone: " . $this->phone . "<br>";
          echo "Email: " . $this->email;
        }
      }
    ?>
  

Результат виконання коду:

Name: Fred
Pass: pword
Phone: 012 345 6789
Email: fred@bloggs.com

Інструкція parent

Коли в підкласі створюється метод з ім'ям, яке вже фігурує в його рідному класі, його інструкції переписують інструкції з батьківського класу. Іноді така поведінка йде врозріз з вашими бажаннями, і вам потрібно отримати доступ до батьківського методу. для цього можна скористатися інструкцією parent, як показано в прикладі 5.25.

Приклад 5.25. Переписання метода та використання інструкції parent

    <?php
      $object = new Son;
      $object->test();
      $object->test2();

      class Dad {
        function test() {
          echo "[Class Dad] Я твій батько<br>";
        }
      }

      class Son extends Dad {
        function test() {
          echo "[Class Son] Я Лука<br>";
        }
        function test2() {
          parent::test();
        }
      }
    ?>
  

Результат виконання коду:

[Class Son] Я Лука
[Class Dad] Я твій батько

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

self::method();

Конструктори підкласу

При поширенні класу і оголошенні власного конструктора, PHP не стане автоматично викликати метод-конструктор батьківського класу. Щоб забезпечувалося виконання всього коду ініціалізації, підклас, як показано в прикладі 5.26, завжди повинен викликати батьківські конструктори.

Приклад 5.26. Виклик конструктора батьківського класу

    <?php
      $object = new Tiger();
      echo "У тигрів є...<br>";
      echo "Хутро: " . $object->fur . "<br>";
      echo "Полоски: " . $object->stripes;

      class Wildcat {
        public $fur; //У тигрів є хутро

        function __construct() {
          $this->fur = "TRUE";
        }
      }

      class Tiger extends Wildcat {
        public $stripes; //У тигрів є полоски

        function __construct() {
          parent::__construct(); //Першочерговий виклик батьквіського конструктора
          $this->stripes = "TRUE";
        }
      }
    ?>
  

Результат виконання коду:

У тигрів є...
Хутро: TRUE
Полоски: TRUE

Методи Final

При необхідності перешкодити підкласу переписати метод суперкласу можна скористатися ключовим словом final. Як це робиться, показано в прикладі 5.27.

Приклад 5.27. Створення методу final

    <?php
      class User3 {
        final function copyright() {
          echo "Цей клас було створено by: Peturik";
        }
      }

      $object = new User3;
      echo $object->copyright();
    ?>
  
    Цей клас було створено by: Peturik