Магические методы в PHP

Магические методы — методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются отдельные действия.

    Магические методы

    Магические методы — методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются отдельные действия
    Магические методы, за исключением __construct(), __destruct() и __clone(), ДОЛЖНЫ объявляться как public
    Если в определении магического метода указали объявления типа, они должны повторять сигнатуру, которую описывает этот документ
    Функция serialize() проверяет, определили ли в классе метод с магическим именем __sleep(). Если метод определили, он выполняется перед сериализацией. Метод может очистить объект и должен вернуть массив с именами всех переменных этого объекта, которые должны быть сериализованы
    Начиная с PHP 8.0.0 возврат из метода __sleep() значения, которое не является массивом, генерирует предупреждение
    Назначение метода __sleep() — зафиксировать отложенные данные или выполнить аналогичные задачи очистки. Метод также будет полезным, когда требуется сохранить только часть объекта
    И наоборот, функция unserialize() проверяет наличие метода с магическим именем __wakeup(). Если метод определили, функция может восстанавливать любые ресурсы, которые может иметь объект

    class Connection { protected $link; private $dsn, $username, $password; public function __construct($dsn, $username, $password) { $this->dsn = $dsn; $this->username = $username; $this->password = $password; $this->connect(); } private function connect() { $this->link = "<br>$this->dsn, $this->username, $this->password<br>"; echo "Соединение установлено: " . $this->link . "<br>"; } public function __sleep() { echo "Метод __sleep() отработал<br>"; return array('dsn', 'username', 'password'); } public function __wakeup() { echo "Вызово функции __wakeup()<br>"; $this->connect(); } } $class = new Connection('test', 'Егор', '*********'); $a = serialize($class); var_dump($a); echo "<br>"; $a = unserialize($a); var_dump($a); echo "<br>";

    Методу __sleep() нельзя возвращать имена закрытых свойств в родительских классах
    __serialize
    __unserialize
    Если в одном и том же объекте определили оба метода — и __serialize(), и __sleep(), PHP вызовет только метод __serialize(). Метод __sleep() проигнорируется. Если объект реализует интерфейс Serializable, PHP проигнорирует интерфейсный метод serialize(), и вместо него будет использовать метод __serialize()
    Назначение метода __serialize() заключается в определении удобного для сериализации произвольного представления объекта. Элементам массива разрешается соответствовать свойствам объекта, но это не обязательно
    Функция unserialize() проверяет присутствие магического метода __unserialize(). Если метод определили, PHP передаст методу массив, который восстановил и вернул метод __serialize()


    Если в одном и том же объекте определили оба метода — и __unserialize(), и __wakeup(), PHP вызовет только метод __unserialize(). Метод __wakeup() проигнорируется
    Метод __toString() - разрешает классу выбирать, как класс будет реагировать, когда с ним обращаются как со строкой. Например, класс решает, что выведет выражение echo $obj;
    С PHP 8.0.0 любой класс, в котором описали метод __toString(), также будет неявно реализовывать интерфейс Stringable и, таким образом, будет проходить проверку типа для этого интерфейса. В любом случае рекомендуется явно реализовать интерфейс.

    #Использование метода __toString() class TestClass { private $foo; public function __construct ($foo) { $this->foo = $foo; } public function __toString() { return $this->foo; } } $class = new TestClass('Привет'); echo $class; # Привет

    Метод __invoke() вызывается, когда скрипт пытается выполнить объект как функцию

    class CallableClass { public function __invoke($x) { echo $x . "<br>"; } } $obj = new CallableClass(); #Выполнить объект как функцию $obj(5); var_dump(is_callable($obj));
    Источники
    Последнее изменение: 19.11.2024 15:47


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ