Введение в магические методы
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 44 из 91.
Magic methods — это специальные методы в PHP, которые начинаются с двойных знаков подчёркивания (__) и автоматически вызываются PHP в ответ на определённые события или действия. Ты уже использовал два из них: __construct() и __destruct().
Эти method позволяют подключаться к внутреннему поведению PHP и настраивать реакцию ваших object на распространённые операции.
Например, что происходит, когда вы пытаетесь вывести object? Или получить доступ к свойству, которого не существует? Magic methods дают вам контроль над такими ситуациями.
Вот краткий обзор наиболее часто используемых magic-методов:
| Method | Когда вызывается |
|---|---|
__construct() | Object создаётся |
__destruct() | Object уничтожается |
__toString() | Object используется как string |
__get() | Обращение к неопределённому свойству |
__set() | Установка неопределённого свойства |
__call() | Вызов неопределённого method |
__clone() | Object клонируется |
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book;
Output:
Book: PHP MasteryБез __toString() попытка выполнить echo для object вызвала бы ошибку. Magic method перехватывает это действие и вместо этого возвращает строковое представление. В следующих уроках мы подробно рассмотрим каждый magic method.
Задание
ЛегкоДавайте создадим систему каталога фильмов, которая познакомит вас с magic method. Вы создадите класс Movie, использующий __construct() для инициализации данных о фильме и __toString() для предоставления удобного строкового представления при выводе object.
Вы организуете код в двух файлах:
Movie.php: Создайте классMovie, представляющий фильмы в вашем каталоге. Используйте constructor promotion, чтобы define private properties для$title(string),$director(string) и$year(integer). Implement magic method__toString(), который должен Return formatted string:"[title] ([year]) - Directed by [director]". Это позволяет напрямую выводить ваши object фильмов с помощью echo, без вызова отдельного method.main.php: Подключите файл Movie. Вы получите три входных значения: название фильма, имя режиссёра и год выхода. Создайте instanceMovieusing эти values (преобразуйте год в integer). Затем просто напрямую выведите object фильма с помощью echo: method__toString()будет automatically called для формирования Output.
Магия __toString() заключается в том, что PHP автоматически вызывает его, когда ваш object используется в строковом контексте. Вместо записи echo $movie->getInfo(); вы можете просто написать echo $movie;, и PHP выполнит преобразование за вас. Благодаря этому с вашими object становится интуитивнее работать.
Попробуйте сами
<?php
require_once 'Movie.php';
// Прочитать ввод
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: Создайте экземпляр Movie, используя входные значения
// TODO: Выведите объект movie напрямую (метод __toString() будет вызван автоматически)
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP