__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.
Desafío
FácilVamos 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 claseCredentialque 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 paravar_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 deCredentialcon estos valores. Primero, imprime (echo) el objeto credential directamente (esto activa__toString()). Luego, en una nueva línea, usavar_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
?>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 OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - 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 __unserializeResumen - 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)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy