Объяснение магических методов

PHP. Объяснение магических методов PHP. Что такое… | by Atakan Demircioğlu

php-magic-methods

Atakan 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 выдает фатальные ошибки, когда реализации интерфейса и наследование классов нарушают

LSP . Магические методы следуют той же схеме.

  • Типы возвращаемых значений разрешены для узкого типа возвращаемого значения.
  • Метод параметры разрешены для расширения типа параметра.

Варианты разрешены

Подобно стандартному наследованию классов/интерфейсов, также разрешены варианты магических методов.

Например, метод __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.

0 продолжать настаивать на этом.

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