__toString & __debugInfo
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 45 von 91.
Die Methode __toString() ermöglicht es Ihnen zu definieren, wie ein Objekt als String dargestellt werden soll. Dies wird automatisch aufgerufen, wenn Sie ein Objekt in einem String-Kontext verwenden, wie zum Beispiel mit echo oder bei einer String-Verkettung.
<?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;
Ausgabe:
Alice (alice@example.com)Die Methode __debugInfo() steuert, welche Informationen angezeigt werden, wenn Sie var_dump() auf ein Objekt anwenden. Dies ist nützlich, um sensible Daten auszublenden oder berechnete Werte während des Debuggings anzuzeigen:
<?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);
Ausgabe:
object(BankAccount)#1 (3) {
["accountNumber"]=>
string(8) "****7890"
["balance"]=>
float(1500)
["pin"]=>
string(8) "[HIDDEN]"
}Beachten Sie, wie __debugInfo() ein Array von Schlüssel-Wert-Paaren zurückgibt, die den standardmäßigen Eigenschafts-Dump ersetzen. Die sensible PIN ist verborgen und die Kontonummer ist teilweise maskiert – perfekt für sicheres Debugging.
Aufgabe
EinfachLassen Sie uns ein System zur Verwaltung von Anmeldedaten erstellen, das sowohl die magischen Methoden __toString() als auch __debugInfo() demonstriert. Sie werden eine Klasse erstellen, die beim Drucken benutzerfreundliche Informationen anzeigt und gleichzeitig sensible Daten während des Debuggings schützt.
Sie werden Ihren Code in zwei Dateien organisieren:
Credential.php— Erstellen Sie eine KlasseCredential, die Anmeldeinformationen sicher speichert. Verwenden Sie Constructor Promotion, um private Eigenschaften für$username(string),$password(string) und$lastLogin(string) zu definieren. Implementieren Sie zwei magische Methoden:__toString()— Gibt eine benutzerfreundliche Zeichenfolge zurück:"User: [username] (Last login: [lastLogin])". Beachten Sie, dass das Passwort in der String-Repräsentation niemals offengelegt wird.__debugInfo()— Gibt ein Array fürvar_dump()zurück, das den Benutzernamen so anzeigt, wie er ist, das Passwort maskiert, indem es nur"[PROTECTED]"anzeigt, und das Datum der letzten Anmeldung normal darstellt.
main.php— Binden Sie die Datei Credential ein. Sie erhalten drei Eingaben: einen Benutzernamen, ein Passwort und ein Datum für die letzte Anmeldung. Erstellen Sie eineCredential-Instanz mit diesen Werten. Geben Sie zuerst das Credential-Objekt direkt mit echo aus (dies löst__toString()aus). Verwenden Sie dann in einer neuen Zeilevar_dump()auf das Objekt, um die geschützte Debug-Ausgabe zu sehen.
Die Methode __toString() bietet eine saubere und sichere Möglichkeit, die Anmeldedaten anzuzeigen, ohne das Passwort preiszugeben. Die Methode __debugInfo() stellt sicher, dass sensible Informationen selbst während des Debuggings verborgen bleiben – eine entscheidende Praxis bei der Arbeit mit Authentifizierungsdaten.
Spickzettel
Die Methode __toString() definiert, wie ein Objekt als String dargestellt wird, wenn es mit echo oder String-Verkettung verwendet wird:
<?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)
Die Methode __debugInfo() steuert, welche Informationen angezeigt werden, wenn var_dump() auf ein Objekt angewendet wird. Sie gibt ein Array von Schlüssel-Wert-Paaren zurück, die angezeigt werden sollen:
<?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);
// Zeigt die maskierte Kontonummer und die versteckte PIN
Diese Methoden sind nützlich, um sensible Daten zu verbergen oder die Objektausgabe für verschiedene Kontexte anzupassen.
Probier es selbst
<?php
require_once 'Credential.php';
// Eingaben lesen
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: Erstellen Sie eine Credential-Instanz mit den Eingabewerten
// TODO: Geben Sie das Credential-Objekt mit echo aus (löst __toString() aus)
// TODO: Verwenden Sie var_dump() auf das Objekt, um die geschützte Debug-Ausgabe zu sehen
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung