Перевантаження

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

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

Усі методи навантаження мають бути оголошені як public

Зауваження :

Жоден з аргументів цих магічних методів може бути переданий за посиланням

Зауваження :

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

Перевантаження властивостей

public __set(string $name, mixed $value): void
public __get(string $name): mixed
public __isset(string $name): bool
public __unset(string $name): void

Метод__set() буде виконано під час запису даних у недоступні (захищені та приватні) або неіснуючі властивості.

Метод__get() буде виконано під час читання даних із недоступних (захищених чи приватних) чи неіснуючих властивостей.

Метод__isset() буде виконано при використанні isset() або empty() на недоступних (захищених чи приватних) чи неіснуючих властивостях.

Метод__unset() буде виконано під час виклику unset() на недоступній (захищеній або приватній) або неіснуючій властивості.

Аргумент $name являє собою ім'я властивості, що викликається. Метод __set() містить аргумент $value, що є значенням, яке буде записано у властивість з ім'ям $name.

Перевантаження властивостей працює лише у контексті об'єкта. Дані магічні методи не будуть викликані у статичному контексті. Тому ці методи не повинні оголошуватися статичними. При оголошенні будь-якого магічного методу як static буде видано попередження.

Зауваження :

Возвращаемое значение__set()будет проигнорировано из-за способа обработки в PHP оператора присваивания. Аналогично,__get() ніколи не викликається при об'єднанні присвоювань, наприклад, таким чином:

$a = $obj->b = 8;

Зауваження :

PHP не викликатиме перевантажений метод зсередини того ж перевантаженого методу. Це означає, що, наприклад, написання return $this->fooвнутри__get() поверне null та викличе помилку рівня E_WARNING, если не определено свойствоfooзамість того, щоб викликати метод __get() вдруге. Однак методи перевантаження можуть неявно викликати інші методи навантаження (наприклад, метод __set() викликає метод __get()

Приклад #1 Перевантаження властивостей за допомогою методів __get() __set() __isset() і __unset()

Loading...

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

Установка 'a' в '1'
Получение 'a'
1

Установлено ли 'a'?
bool(true)
Уничтожение 'a'
Установлено ли 'a'?
bool(false)

1

Давайте поэкспериментируем с закрытым свойством 'hidden':
Закрытые свойства видны внутри класса, поэтому __get() не используется...
2
Закрытые свойства не видны вне класса, поэтому __get() используется...
Получение 'hidden'


Notice: Неопределённое свойство в __get(): hidden в <file> on line 70 in <file> on line 29

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

public __call(string $name, array $arguments): mixed
public static __callStatic(string $name, array $arguments): mixed

__call() запускається під час виклику недоступних методів у контексті об'єкт.

__callStatic() запускається під час виклику недоступних методів у статичному контексті.

Аргумент $name являє собою ім'я методу, що викликається. Аргумент $arguments є нумерованим масивом, що містить параметри, передані в метод $name, що викликається.

Приклад #2 Перевантаження методів за допомогою методів __call() і __callStatic()

Loading...

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

Вызов метода 'runTest' в контексте объекта
Вызов статического метода 'runTest' в статическом контексте