ООП – Перевантаження та магічні методи
21.04.2022Перевантаження в PHP дає можливість динамічно “створювати” властивості та методи. Такі методи та властивості обробляються за допомогою “чарівних” методів, які можна створити в класі для різних видів дій.
Перевантаження властивостей
Звернення до властивостей об’єкта може бути перевантажені з допомогою методів __get і __set. Ці методи спрацьовуватимуть у тому випадку, якщо об’єкт не містить властивості, до якого здійснюється доступ. Синтаксис:
// синтаксис
<?php
public void __set (string $name , mixed $value)
public mixed __get (string $name)
?>
// приклад
<?php
class MyClass {
public $c = "c value";
public function __set($name, $value) {
echo "__set, property - {$name} is not exists \n";
}
public function __get($name) {
echo "__get, property - {$name} is not exists \n";
}
}
$obj = new MyClass;
$obj->a = 1; // запис у властивість (властивість не існує)
echo $obj->b; // отримуємо значення властивості (властивість не існує)
echo $obj->c; // отримуємо значення властивості (властивість існує)
?>
// результат виконання
__set, property - a is not exists
__get, property - b is not exists
c value
Перевантаження методів
Виклики методів можуть бути перевантажені за допомогою методів __call. Ці методи спрацьовуватимуть у тому випадку, якщо об’єкт не містить методу, до якого здійснюється доступ.
// синтаксис
<?php
public mixed __call (string $name , array $arguments)
?>
// приклад
<?php
class MyClass {
public function __call($name, $arguments) {
return "__call, method - {$name} is not exists \n";
}
public function getId() {
return "Hello simplify";
}
}
$obj = new MyClass;
echo $obj->getName(); // виклик методу (метод не існує)
echo $obj->getId(); // виклик методу (метод існує)
?>
// результат виконання
_call, method - getName is not exists (під час виклику getName)
Hello simplify (під час виклику getId)