Перевантаження і магічні методи


Перевантаження в 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 "AH-15474";
	}
}

$obj = new MyClass;
echo $obj->getName(); // виклик метода (метод не існує)
echo $obj->getId(); // виклик метода (метод не існує)
?>

Результат:

__call, method - getName is not exists (при вызове getName)
AH-15474 (при вызове getId)

Магічний метод __toString

Метод __toString() буде спрацьовувати при спробі перетворення класу в рядок. Наприклад, echo $obj;.

Синтаксис:

<?php
public string __toString()
?>

Приклад:

<?php
class MyClass {
	public function __toString() {
		return "MyClass class";
	}
}

$obj = new MyClass;
echo $obj; // результат: MyClass class
?>

Магічний метод __invoke()

Метод __invoke() викликається, коли об’єкт намагаються викликати як функцію.

Синтаксис:

<?php
mixed __invoke ([ $... ] )
?>

Приклад:

<?php
class MyClass {
	public function __invoke($a) {
		return $a;
	}
}

$obj = new MyClass;
echo $obj(75); // результат: 75
?>