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 ослабляет принудительное применение подписи при частный
метод повторно объявлен в дочернем классе.