__toString & __debugInfo
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 45 sur 91.
La méthode __toString() vous permet de définir comment un objet doit être représenté sous forme de chaîne de caractères. Elle est appelée automatiquement lorsque vous utilisez un objet dans un contexte de chaîne, comme avec echo ou une concaténation de chaînes.
<?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;
Résultat :
Alice (alice@example.com)La méthode __debugInfo() contrôle les informations qui s'affichent lorsque vous utilisez var_dump() sur un objet. Ceci est utile pour masquer des données sensibles ou afficher des valeurs calculées lors du débogage :
<?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);
Sortie :
object(BankAccount)#1 (3) {
["accountNumber"]=>
string(8) "****7890"
["balance"]=>
float(1500)
["pin"]=>
string(8) "[HIDDEN]"
}Remarquez comment __debugInfo() retourne un tableau de paires clé-valeur qui remplace l'affichage par défaut des propriétés. Le code PIN sensible est masqué, et le numéro de compte est partiellement masqué - parfait pour un débogage sécurisé.
Défi
FacileConstruisons un système de gestion d'identifiants qui démontre l'utilisation des méthodes magiques __toString() et __debugInfo(). Vous allez créer une classe qui affiche des informations conviviales lors de l'impression, tout en protégeant les données sensibles pendant le débogage.
Vous organiserez votre code sur deux fichiers :
Credential.php— Créez une classeCredentialqui stocke les informations de connexion de manière sécurisée. Utilisez la promotion de constructeur pour définir des propriétés privées pour$username(string),$password(string), et$lastLogin(string). Implémentez deux méthodes magiques :__toString()— Retourne une chaîne conviviale :"User: " . $this->username . " (Last login: " . $this->lastLogin . ")". Notez que le mot de passe n'est jamais exposé dans la représentation sous forme de chaîne.__debugInfo()— Retourne un tableau pourvar_dump()qui affiche le nom d'utilisateur tel quel, masque le mot de passe en affichant uniquement"[PROTECTED]", et affiche la date de dernière connexion normalement.
main.php— Incluez le fichier Credential. Vous recevrez trois entrées : un nom d'utilisateur, un mot de passe et une date de dernière connexion. Créez une instance deCredentialavec ces valeurs. D'abord, affichez l'objet credential directement avec echo (cela déclenche__toString()). Ensuite, sur une nouvelle ligne, utilisezvar_dump()sur l'objet pour voir la sortie de débogage protégée.
La méthode __toString() offre un moyen propre et sûr d'afficher l'identifiant sans exposer le mot de passe. La méthode __debugInfo() garantit que même pendant le débogage, les informations sensibles restent cachées — une pratique cruciale lors de la manipulation de données d'authentification.
Aide-mémoire
La méthode __toString() définit comment un objet est représenté sous forme de chaîne de caractères lorsqu'il est utilisé avec echo ou une concaténation de chaînes :
<?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)
La méthode __debugInfo() contrôle les informations qui apparaissent lors de l'utilisation de var_dump() sur un objet. Elle retourne un tableau de paires clé-valeur à afficher :
<?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);
// Shows masked account number and hidden PIN
Ces méthodes sont utiles pour masquer des données sensibles ou personnaliser la sortie d'un objet pour différents contextes.
Essayez vous-même
<?php
require_once 'Credential.php';
// Lire les entrées
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: Créer une instance de Credential avec les valeurs d'entrée
// TODO: Afficher l'objet credential (déclenche __toString())
// TODO: Utiliser var_dump() sur l'objet pour voir la sortie de débogage protégée
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie