Menu
Coddy logo textTech

__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.

challenge icon

Sfida

Facile

Creiamo 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 classe Credential che 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 per var_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 di Credential con questi valori. Per prima cosa, stampa direttamente l'oggetto credenziale (questo attiva __toString()). Poi, su una nuova riga, usa var_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

?>
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore PHP online