Перевантаження
Перевантаження в 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' в статическом контексте