__toString и __debugInfo
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 45 из 91.
Метод __toString() позволяет определить, как объект должен быть представлен в виде строки. Он вызывается автоматически при использовании объекта в строковом контексте, например, с помощью echo или конкатенации строк.
<?php
class User {
public function __construct(
private string $name,
private string $email
) {}
public function __toString(): string {
return $this->name . " (" . $this->email . ")";
}
}
$user = new User("Alice", "alice@example.com");
echo $user;
Вывод:
Alice (alice@example.com)Метод __debugInfo() управляет тем, какая информация отображается при использовании var_dump() для объекта. Это полезно для скрытия конфиденциальных данных или отображения вычисляемых значений во время отладки:
<?php
class BankAccount {
public function __construct(
private string $accountNumber,
private float $balance,
private string $pin
) {}
public function __debugInfo(): array {
return [
'accountNumber' => '****' . substr($this->accountNumber, -4),
'balance' => $this->balance,
'pin' => '[HIDDEN]'
];
}
}
$account = new BankAccount("1234567890", 1500.00, "9876");
var_dump($account);
Вывод:
object(BankAccount)#1 (3) {
["accountNumber"]=>
string(8) "****7890"
["balance"]=>
float(1500)
["pin"]=>
string(8) "[HIDDEN]"
}Обратите внимание, как __debugInfo() возвращает массив пар ключ-значение, которые заменяют стандартный дамп свойств. Конфиденциальный PIN-код скрыт, а номер счета частично замаскирован — это идеально подходит для безопасной отладки.
Задание
ЛегкоДавайте создадим систему управления учетными данными, которая демонстрирует работу магических методов __toString() и __debugInfo(). Вы создадите класс, который отображает удобную для пользователя информацию при выводе на печать, защищая при этом конфиденциальные данные во время отладки.
Вы организуете свой код в двух файлах:
Credential.php— Создайте классCredential, который безопасно хранит информацию для входа. Используйте продвижение свойств в конструкторе (constructor promotion) для определения закрытых свойств$username(string),$password(string) и$lastLogin(string). Реализуйте два магических метода:__toString()— Возвращает удобную для пользователя строку:"User: [username] (Last login: [lastLogin])". Обратите внимание, что пароль никогда не раскрывается в строковом представлении.__debugInfo()— Возвращает массив дляvar_dump(), который показывает имя пользователя как есть, маскирует пароль, показывая только"[PROTECTED]", и нормально отображает дату последнего входа.
main.php— Подключите файл Credential. Вы получите три входных значения: имя пользователя, пароль и дату последнего входа. Создайте экземплярCredentialс этими значениями. Сначала выведите объект учетных данных напрямую с помощью echo (это вызовет__toString()). Затем на новой строке используйтеvar_dump()для объекта, чтобы увидеть защищенный отладочный вывод.
Метод __toString() обеспечивает чистый и безопасный способ отображения учетных данных без раскрытия пароля. Метод __debugInfo() гарантирует, что даже во время отладки конфиденциальная информация остается скрытой — это важная практика при работе с данными аутентификации.
Шпаргалка
Метод __toString() определяет, как объект представляется в виде строки при использовании с echo или конкатенацией строк:
<?php
class User {
public function __construct(
private string $name,
private string $email
) {}
public function __toString(): string {
return $this->name . " (" . $this->email . ")";
}
}
$user = new User("Alice", "alice@example.com");
echo $user; // Alice (alice@example.com)
Метод __debugInfo() управляет тем, какая информация отображается при использовании var_dump() для объекта. Он возвращает массив пар ключ-значение для отображения:
<?php
class BankAccount {
public function __construct(
private string $accountNumber,
private float $balance,
private string $pin
) {}
public function __debugInfo(): array {
return [
'accountNumber' => '****' . substr($this->accountNumber, -4),
'balance' => $this->balance,
'pin' => '[HIDDEN]'
];
}
}
$account = new BankAccount("1234567890", 1500.00, "9876");
var_dump($account);
// Показывает маскированный номер счета и скрытый PIN-код
Эти методы полезны для скрытия конфиденциальных данных или настройки вывода объекта для различных контекстов.
Попробуйте сами
<?php
require_once 'Credential.php';
// Чтение входных данных
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: Создать экземпляр Credential с входными значениями
// TODO: Вывести объект credential через echo (вызывает __toString())
// TODO: Использовать var_dump() для объекта, чтобы увидеть защищенный отладочный вывод
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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