Menu
Coddy logo textTech

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

challenge icon

Задание

Легко

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

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

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

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