Menu
Coddy logo textTech

Введение в магические методы

Часть раздела Объектно-ориентированное программирование путешествия по 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 приведет к ошибке. Магический метод перехватывает это действие и вместо этого возвращает строковое представление. В следующих уроках мы подробно изучим каждый магический метод.

challenge icon

Задание

Легко

Давайте создадим систему каталога фильмов, которая познакомит вас с магическими методами. Вы создадите класс 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() будет вызван автоматически)

?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование