__toString e __debugInfo
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 45 di 91.
Il metodo __toString() ti permette di definire come un oggetto debba essere rappresentato come stringa. Viene chiamato automaticamente quando usi un oggetto in un contesto di stringa, ad esempio con echo o la concatenazione di stringhe.
<?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;
Output:
Alice (alice@example.com)Il metodo __debugInfo() controlla quali informazioni vengono visualizzate quando usi var_dump() su un oggetto. È utile per nascondere dati sensibili o mostrare valori calcolati durante il debug:
<?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);
Output:
object(BankAccount)#1 (3) {
["accountNumber"]=>
string(8) "****7890"
["balance"]=>
float(1500)
["pin"]=>
string(8) "[HIDDEN]"
}Nota come __debugInfo() restituisce un array di coppie chiave-valore che sostituiscono la visualizzazione predefinita delle proprietà. Il PIN sensibile è nascosto e il numero di conto è parzialmente oscurato: perfetto per un debug sicuro.
Sfida
FacileCreiamo un sistema di gestione delle credenziali che dimostri sia il metodo magico __toString() sia __debugInfo(). Creerai una classe che mostra informazioni di facile lettura quando viene stampata, proteggendo al contempo i dati sensibili durante il debug.
Organizzerai il codice in due file:
Credential.php: crea una classeCredentialche memorizza in modo sicuro le informazioni di accesso. Usa la promozione del costruttore per definire proprietà private per$username(stringa),$password(stringa) e$lastLogin(stringa). Implementa due metodi magici:__toString(): restituisce una stringa di facile lettura:"User: [username] (Last login: [lastLogin])". Nota che la password non viene mai esposta nella rappresentazione come stringa.__debugInfo(): restituisce un array pervar_dump()che mostra il nome utente così com'è, maschera la password mostrando solo"[PROTECTED]"e visualizza normalmente la data dell'ultimo accesso.
main.php: includi il file Credential. Riceverai tre input: un nome utente, una password e una data dell'ultimo accesso. Crea un'istanza diCredentialcon questi valori. Per prima cosa, stampa direttamente l'oggetto credenziale (questo attiva__toString()). Poi, su una nuova riga, usavar_dump()sull'oggetto per visualizzare l'output di debug protetto.
Il metodo __toString() offre un modo chiaro e sicuro per visualizzare la credenziale senza esporre la password. Il metodo __debugInfo() garantisce che le informazioni sensibili restino nascoste anche durante il debug: una pratica fondamentale quando si lavora con dati di autenticazione.
Provalo tu
<?php
require_once 'Credential.php';
// Leggi i dati di input
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: Crea un'istanza di Credential con i valori di input
// TODO: Stampa l'oggetto credenziale (attiva __toString())
// TODO: Usa var_dump() sull'oggetto per vedere l'output di debug protetto
?>Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online