__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() te permite definir cómo debe representarse un objeto como cadena. Esto se llama automáticamente cuando usas 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 resulta útil para ocultar datos confidenciales 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);
Salida:
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: perfecto para una depuración segura.
Desafío
FácilConstruyamos 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 fácil de entender para el usuario al imprimirse, mientras protege los datos sensibles durante la depuración.
Organizarás tu código en dos archivos:
Credential.php: Crea una claseCredentialque almacene de forma segura la información de inicio de sesión. Usa la promoción de constructores para definir propiedades privadas para$username(string),$password(string) y$lastLogin(string). Implementa dos métodos mágicos:__toString(): Devuelve una cadena fácil de entender 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 paravar_dump()que muestra el nombre de usuario tal cual, enmascara la contraseña mostrando únicamente"[PROTECTED]"y muestra normalmente la fecha del último inicio de sesión.
main.php: Incluye el archivo Credential. Recibirás tres entradas: un nombre de usuario, una contraseña y una fecha del último inicio de sesión. Crea una instancia deCredentialcon estos valores. Primero, haz echo directamente del objeto de credenciales (esto activa__toString()). Después, en una línea nueva, usavar_dump()en el objeto para ver la salida de depuración protegida.
El método __toString() proporciona una forma clara 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 fundamental al trabajar con datos de autenticación.
Pruébalo tú mismo
<?php
require_once 'Credential.php';
// Leer entradas
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: Crea una instancia de Credential con los valores de entrada
// TODO: Haz echo del objeto credential (dispara __toString())
// TODO: Usa var_dump() en el objeto para ver la salida de depuración protegida
?>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
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online