__toString и __debugInfo
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 45 из 91.
Метод __toString() позволяет define, как object должен быть представлен в виде строки. Это вызывается автоматически, когда вы используете object в строковом контексте, например с 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 скрыт, а номер account частично замаскирован — идеально для безопасной отладки.
Задание
ЛегкоДавайте создадим систему управления учетными данными, демонстрирующую работу магических методов __toString() и __debugInfo(). Вы создадите class, который отображает понятную пользователю информацию при выводе, защищая конфиденциальные данные во время отладки.
Вы организуете код в двух файлах:
Credential.php: СоздайтеCredentialclass, который безопасно хранит данные для входа. Используйте продвижение параметров конструктора, чтобы определить private properties для$username(string),$password(string) и$lastLogin(string). Implement два магических метода:__toString(): Возвращает понятную пользователю строку:"User: [username] (Last login: [lastLogin])". Обратите внимание, что password никогда не раскрывается в строковом представлении.__debugInfo(): Возвращает array дляvar_dump(), которая показывает username без изменений, маскирует password, отображая только"[PROTECTED]", и обычно отображает дату последнего входа.
main.php: Подключите файл Credential. Вы получите три входных значения: username, password и дату последнего входа. Создайте экземплярCredentialс этими значениями. Сначала напрямую выведите объект учетных данных с помощью echo (это вызывает__toString()). Затем с новой строки применитеvar_dump()к объекту, чтобы увидеть защищенный отладочный вывод.
Метод __toString() обеспечивает чистый и безопасный способ отображения учетных данных без раскрытия password. Метод __debugInfo() гарантирует, что даже во время отладки конфиденциальная информация остается скрытой: это важная практика при работе с данными аутентификации.
Попробуйте сами
<?php
require_once 'Credential.php';
// Читать входные данные
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: Создать экземпляр Credential с входными значениями
// TODO: Вывести объект credential (вызывает __toString())
// TODO: Использовать var_dump() для объекта, чтобы увидеть защищённый отладочный вывод
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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