Menu
Coddy logo textTech

__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 частично замаскирован — идеально для безопасной отладки.

challenge icon

Задание

Легко

Давайте создадим систему управления учетными данными, демонстрирующую работу магических методов __toString() и __debugInfo(). Вы создадите class, который отображает понятную пользователю информацию при выводе, защищая конфиденциальные данные во время отладки.

Вы организуете код в двух файлах:

  • Credential.php: Создайте Credential class, который безопасно хранит данные для входа. Используйте продвижение параметров конструктора, чтобы определить 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() для объекта, чтобы увидеть защищённый отладочный вывод

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор PHP