Введение в магические методы
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 44 из 91.
Магические методы — это специальные методы в PHP, которые начинаются с двойного подчеркивания (__) и автоматически вызываются PHP в ответ на определенные события или действия. Вы уже использовали два из них: __construct() и __destruct().
Эти методы позволяют вам подключаться к внутреннему поведению PHP и настраивать то, как ваши объекты реагируют на стандартные операции.
Например, что произойдет, если вы попытаетесь вывести объект? Или обратиться к свойству, которого не существует? Магические методы дают вам контроль над такими ситуациями.
Вот краткий обзор наиболее часто используемых магических методов:
| Метод | Вызывается, когда |
|---|---|
__construct() | Объект создан |
__destruct() | Объект уничтожен |
__toString() | Объект используется как строка |
__get() | Происходит обращение к неопределенному свойству |
__set() | Происходит присвоение значения неопределенному свойству |
__call() | Вызывается неопределенный метод |
__clone() | Объект клонирован |
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book;
Вывод:
Book: PHP MasteryБез __toString() попытка вывести объект через echo приведет к ошибке. Магический метод перехватывает это действие и вместо этого возвращает строковое представление. В следующих уроках мы подробно изучим каждый магический метод.
Задание
ЛегкоДавайте создадим систему каталога фильмов, которая познакомит вас с магическими методами. Вы создадите класс Movie, который использует __construct() для инициализации данных о фильме и __toString() для обеспечения чистого строкового представления при выводе объекта на печать.
Вы организуете свой код в двух файлах:
Movie.php— Создайте классMovie, который представляет фильмы в вашем каталоге. Используйте продвижение свойств в конструкторе (constructor promotion) для определения закрытых свойств$title(string),$director(string) и$year(integer). Реализуйте магический метод__toString(), чтобы он возвращал отформатированную строку:"[title] ([year]) - Directed by [director]". Это позволит выводить объекты ваших фильмов напрямую через echo без вызова отдельного метода.main.php— Подключите файл Movie. Вы получите три входных значения: название фильма, имя режиссера и год выпуска. Создайте экземплярMovie, используя эти значения (преобразуйте год в целое число). Затем просто выведите объект фильма напрямую через echo — метод__toString()будет вызван автоматически для формирования вывода.
Магия __toString() заключается в том, что PHP автоматически вызывает его всякий раз, когда ваш объект используется в строковом контексте. Вместо того чтобы писать echo $movie->getInfo();, вы можете просто написать echo $movie;, и PHP сам позаботится о преобразовании. Это делает работу с вашими объектами более интуитивно понятной.
Шпаргалка
Магические методы — это специальные методы в PHP, которые начинаются с двойного подчеркивания (__) и автоматически вызываются PHP в ответ на определенные события или действия.
Распространенные магические методы:
| Метод | Вызывается, когда |
|---|---|
__construct() | Объект создан |
__destruct() | Объект уничтожен |
__toString() | Объект используется как строка |
__get() | Обращение к неопределенному свойству |
__set() | Установка значения неопределенному свойству |
__call() | Вызов неопределенного метода |
__clone() | Объект клонирован |
Метод __toString() возвращает строковое представление объекта:
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book; // Вывод: Book: PHP Mastery
Без __toString() попытка вывести объект через echo приведет к ошибке. Магический метод перехватывает это действие и позволяет использовать объект в строковом контексте.
Попробуйте сами
<?php
require_once 'Movie.php';
// Чтение входных данных
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: Создать экземпляр Movie, используя входные значения
// TODO: Вывести объект фильма напрямую (метод __toString() будет вызван автоматически)
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy