PHP. Объяснение магических методов PHP. Что такое… | by Atakan Demircioğlu
php-magic-methodsAtakan Demircioğlu
·
Подписаться
2 мин чтения
·
15 ноября 2022 г. 90 003
Вот мои заметки о методах PHP Magic.
Что такое магические методы PHP?
- специальные методы, которые вызываются автоматически при выполнении определенных условий
- начинаются с двойного подчеркивания ( __ )
- предопределенный
- не может быть создан или удален
- автоматически вызывается
- Все магические методы, за исключением __construct(), __destruct() и __clone(), должны быть объявлены как
public, иначеВыдается E_WARNING.
__construct Magic Method
- автоматически каждый раз, когда создается объект определенного класса
- полезно для инициализации того, что может понадобиться объекту, прежде чем идти дальше
__destruct Magic Method
- вызывается, когда объект уничтожается
__call Magic Method
- вызывается, когда мы вызываем метод, который еще не определен
__callStatic Magic Method
- аналогичный __call( ), но это для статического контекста.

__get Magic Method
- вызывается, когда используется недоступная переменная или несуществующая переменная
__set Magic Method
- вызывается при записи недоступной переменной или несуществующей переменной
__isset Magic Method
- вызывается вызовом isset() или empty() для недоступных (защищенных или закрытых) или несуществующих свойств.
__unset Волшебный метод
- вызывается, когда unset() используется для недоступных (защищенных или частных) или несуществующих свойств.
Магический метод __toString
- вызывается, когда нам нужно преобразовать объект в строку
__invoke Magic Method
- вызывается, когда объект вызывается как функция
__clone Magic Method
- запускается, когда клонирование объектов выполняется с помощью ключевого слова clone
__debugInfo Magic Method
- срабатывает, когда функция var_dump вызывается
__sleep Magic Method
- триггеры функции serialize()
- должны возвращать массив, содержащий все свойства объекта, которые должны быть включены в сериализованную версию этого объекта.

- Для типов ресурсов PHP не может его сериализовать
__wakeup Magic Method
- необходимо инициализировать значение всякий раз, когда мы получаем новый свежий экземпляр из функции unserialize, и это то, что мы делаем внутри метода __wakeup .
__serialize() и __unserialize()
- serialize() проверяет наличие в классе функции с помощью магического метода __serialize(). Если да, функция выполняется перед любой операцией сериализации.
- Если в одном объекте есть и __serialize, и _sleep, будет вызвана только сериализация.
Примечание: Для лучшего понимания того, что происходит в магических методах __sleep и __wakeup, вы можете прочитать эту статью.
Пример из жизни
(__get, __set, __isset, __unset)
Полезное видео для лучшего понимания
Ссылки
- https://medium.com/@luka spereyra8/php-сон и пробуждение -магические-методы-как-и-когда-их-использовать-938591584bdc
- https://www.
php.net/manual/en/resource.php - https://www.geeksforgeeks.org/what-are-magic-methods-and-how-to-use-them- in-php/
Рекомендуемые статьи;
Как защитить сеансы PHP?
Мои заметки о том, как защитить сеансы PHP, что такое перехват сеанса и так далее.
atakde.medium.com
Циклы PHP — что быстрее?
Foreach и for в PHP, какой самый быстрый цикл в PHP?
atakde.medium.com
JIT-компилятор в PHP
Вот мои заметки о JIT-компиляторе в PHP.
atakde.medium.com
Сигнатуры волшебных методов строго соблюдаются
Волшебные методы в PHP — это специальные имена методов класса, которые, если они объявлены, привносят в класс особую функциональность.
В PHP есть несколько магических методов. __constuct() магический метод вызывается, когда новый объект класса создается с помощью новый шаблон Foo() , магический метод __get() вызывается, когда запрашивается несуществующее свойство класса, __toString() магический метод вызывается, когда объект класса приводится к строке , и так на.
Хотя все эти магические методы имели семантическое значение, они не применялись программно до версии PHP 8.0. Метод __toString() , например, семантически ожидает возврата строки , но можно было вернуть любой тип данных, включая те, которые нельзя преобразовать в строки.
класс Фу { публичная функция __toString(): объект { } }
В PHP 8.0 и более поздних версиях, , если объявлен магический метод, он должен соответствовать сигнатуре функции и возвращаемому типу , если объявлен также .
A Несколько проверок подписи применяются для возвращаемых типов с момента их появления в PHP 7.0. А именно, __construct , __destruct и __clone вообще не могли объявлять возвращаемый тип, даже void ( void был добавлен в PHP 7.1).
Типы необязательны
В отличие от интерфейса класса PHP , который обеспечивает присутствие типов параметров и возвращаемых значений во всех реализациях, применение магического метода позволяет вообще не объявлять тип.
Это позволяет существующим классам, реализующим магические методы, продолжать работать без объявления явных типов.
Однако, если тип объявлен , он должен следовать за сигнатурой .
Фатальные ошибки при несоответствии подписи
PHP 8.0 выдает фатальные ошибки, когда реализации интерфейса и наследование классов нарушают
- Типы возвращаемых значений разрешены для узкого типа возвращаемого значения.
- Метод параметры разрешены для расширения типа параметра.
Варианты разрешены
Подобно стандартному наследованию классов/интерфейсов, также разрешены варианты магических методов.
Например, метод __get() , который должен возвращать смешанный тип , может объявить, что возвращаемый тип — bool , поскольку bool уже включен в смешанный тип .
Кроме того, магический метод __set() может расширить свой параметр метода с __set(string $name, $value) до __set(string|CacheEntry $name, $value) , если функция может обрабатывать CacheEntry объекта тоже.
класс GoodFoo {
публичная функция __isset (строка $ name): bool {}
публичная функция __get (строка $ name): смешанная {}
публичная функция __set (строка $ name, смешанное значение $): void {}
публичная функция __unset (строка $ name): void {}
публичная функция __set_state (массив $ свойства): объект {}
публичная функция __call (строка $ name, массив $ аргументов): смешанная {}
публичная функция __callStatic (строка $ name, массив $ аргументов): смешанная {}
публичная функция __invoke (смешанные аргументы $): смешанные {}
публичная функция __clone(): void {}
публичная функция __serialize(): массив {}
публичная функция __unserialize (массив $ data): недействительным {}
публичная функция __sleep(): массив {}
публичная функция __wakeup(): void {}
публичная функция __debugInfo(): ?array {}
} 9}
// Фатальная ошибка: BadBar::__call(): Параметр #1 ($name) должен иметь тип string при объявлении в /in/JpKPd в строке 4 Магические методы, которые не позволяли объявлять какой-либо возвращаемый тип до PHP 8.
класс BadBar {
публичная функция __construct(): void {}
публичная функция __destruct(): void {}
} Ни одно из объявлений не разрешено в PHP 8.0 и более ранних версиях. Они приводят к фатальной ошибке:
Фатальная ошибка: метод BadBar::__construct() не может объявить возвращаемый тип в ... в строке ... Неустранимая ошибка: метод BadBar::__destruct() не может объявить возвращаемый тип в ... в строке ...
Stringable интерфейс PHP 8.0 представляет новый Stringable , который автоматически добавляется к любому классу, реализующему __toString магические методы. Если интерфейс Stringable объявлен явно (например, Foo реализует Stringable ), сигнатура метода __toString() применяется с помощью правил интерфейса.
private Magic Methods PHP 8.0 ослабляет принудительное применение подписи при частный метод повторно объявлен в дочернем классе.



php.net/manual/en/resource.php