Menu
Coddy logo textTech

__toString y __debugInfo

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 45 de 91.

El método __toString() permite definir cómo debe representarse un objeto como una cadena de texto. Esto se llama automáticamente cuando se utiliza un objeto en un contexto de cadena, como con echo o la concatenación de cadenas.

<?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;

Salida:

Alice (alice@example.com)

El método __debugInfo() controla qué información aparece cuando usas var_dump() en un objeto. Esto es útil para ocultar datos sensibles o mostrar valores calculados durante la depuración:

<?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);

Resultado:

object(BankAccount)#1 (3) {
  ["accountNumber"]=>
  string(8) "****7890"
  ["balance"]=>
  float(1500)
  ["pin"]=>
  string(8) "[HIDDEN]"
}

Observa cómo __debugInfo() devuelve un array de pares clave-valor que reemplazan el volcado de propiedades predeterminado. El PIN sensible está oculto y el número de cuenta está parcialmente enmascarado, lo cual es perfecto para una depuración segura.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de gestión de credenciales que demuestre los métodos mágicos __toString() y __debugInfo(). Crearás una clase que muestre información amigable para el usuario cuando se imprima, mientras protege los datos sensibles durante la depuración.

Organizarás tu código en dos archivos:

  • Credential.php — Crea una clase Credential que almacene información de inicio de sesión de forma segura. Usa la promoción de constructor para definir propiedades privadas para $username (string), $password (string) y $lastLogin (string). Implementa dos métodos mágicos:
    • __toString() — Devuelve una cadena amigable para el usuario: "User: [username] (Last login: [lastLogin])". Observa que la contraseña nunca se expone en la representación de cadena.
    • __debugInfo() — Devuelve un array para var_dump() que muestra el nombre de usuario tal cual, enmascara la contraseña mostrando solo "[PROTECTED]" y muestra la fecha del último inicio de sesión normalmente.
  • main.php — Incluye el archivo Credential. Recibirás tres entradas: un nombre de usuario, una contraseña y una fecha de último inicio de sesión. Crea una instancia de Credential con estos valores. Primero, imprime (echo) el objeto credential directamente (esto activa __toString()). Luego, en una nueva línea, usa var_dump() sobre el objeto para ver la salida de depuración protegida.

El método __toString() proporciona una forma limpia y segura de mostrar la credencial sin exponer la contraseña. El método __debugInfo() garantiza que incluso durante la depuración, la información sensible permanezca oculta, una práctica crucial cuando se trabaja con datos de autenticación.

Hoja de referencia

El método __toString() define cómo se representa un objeto como una cadena cuando se utiliza con echo o concatenación de cadenas:

<?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)

El método __debugInfo() controla qué información aparece al usar var_dump() en un objeto. Devuelve un array de pares clave-valor para mostrar:

<?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);
// Muestra el número de cuenta enmascarado y el PIN oculto

Estos métodos son útiles para ocultar datos sensibles o personalizar la salida de objetos para diferentes contextos.

Pruébalo tú mismo

<?php

require_once 'Credential.php';

// Leer entradas
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));

// TODO: Crear una instancia de Credential con los valores de entrada

// TODO: Imprimir el objeto credential (activa __toString())

// TODO: Usar var_dump() en el objeto para ver la salida de depuración protegida

?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos