Object
Клас - це шаблон або зразок, що описує змінні і функції для конкретного виду об'єкта.
Метод - це функція, визначена в класі.
Властивість (свойство) - це змінна, визначена в класі.
Екземпляр - це окремий приклад застосування класу. Створення нового екземпляра класу називається отриманням екземпляра об'єкта.
Конструктор - це спеціальний метод, який виконується автоматично при отриманні примірника об'єкта. Як правило, в конструкторах встановлюються властивості об'єктів і виконуються інші службові операції, що готують об'єкт до застосування.
Статичний метод - це особливий різновид методу, який можна викликати, не отримуючи екземпляр класу. Статичні методи не залежать від значень властивостей конкретного екземпляра
Зміст:
- Приклад 5.10. Оголошення класу і перевірка об'єкта
- Приклад 5.11. Створення об'єкта і взаємодія з ним
- Приклад 5.12 Копіювання об'єкта
- Приклад 5.13. Клонування об'єкта
- Конструктори
- Деструктори в PHP 5
- Написання методів
- Статичні методи в PHP 5
- Об'явлення свойств(властивостей)
- Статичні властивості і методи
- Успадкува́ння (наслідування)
- Інструкція parent
- Конструктори підкласу
- Методи Final
Приклад 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.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