Menu
Coddy logo textTech

__toString i __debugInfo

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 45 z 91.

Metoda __toString() pozwala określić, jak obiekt ma być reprezentowany jako ciąg znaków. Jest wywoływana automatycznie, gdy używasz obiektu w kontekście ciągu znaków, na przykład z echo lub podczas łączenia ciągów znaków.

<?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;

Wynik:

Alice (alice@example.com)

Metoda __debugInfo() kontroluje, jakie informacje pojawiają się po użyciu var_dump() na obiekcie. Przydaje się to do ukrywania poufnych danych lub wyświetlania obliczonych wartości podczas debugowania:

<?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);

Wynik:

object(BankAccount)#1 (3) {
  ["accountNumber"]=>
  string(8) "****7890"
  ["balance"]=>
  float(1500)
  ["pin"]=>
  string(8) "[HIDDEN]"
}

Zwróć uwagę, że __debugInfo() zwraca tablicę par klucz–wartość, które zastępują domyślny zrzut właściwości. Poufny kod PIN jest ukryty, a numer konta częściowo zamaskowany — idealne rozwiązanie do bezpiecznego debugowania.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system zarządzania danymi logowania, który demonstruje działanie magicznych metod __toString() i __debugInfo(). Utworzysz klasę, która wyświetla przyjazne dla użytkownika informacje podczas wypisywania, jednocześnie chroniąc poufne dane podczas debugowania.

Rozmieścisz kod w dwóch plikach:

  • Credential.php: Utwórz klasę Credential, która bezpiecznie przechowuje informacje logowania. Użyj promocji konstruktora, aby zdefiniować prywatne właściwości $username (string), $password (string) i $lastLogin (string). Zaimplementuj dwie magiczne metody:
    • __toString(): Zwraca przyjazny dla użytkownika ciąg znaków: "User: [username] (Last login: [lastLogin])". Zwróć uwagę, że hasło nigdy nie jest ujawniane w reprezentacji tekstowej.
    • __debugInfo(): Zwraca tablicę dla var_dump(), która pokazuje nazwę użytkownika bez zmian, maskuje hasło, wyświetlając tylko "[PROTECTED]", i wyświetla datę ostatniego logowania w zwykły sposób.
  • main.php: Dołącz plik Credential. Otrzymasz trzy dane wejściowe: nazwę użytkownika, hasło i datę ostatniego logowania. Utwórz instancję Credential z tymi wartościami. Najpierw wypisz bezpośrednio obiekt danych logowania (to wywołuje __toString()). Następnie, w nowym wierszu, użyj var_dump() na obiekcie, aby zobaczyć chroniony wynik debugowania.

Metoda __toString() zapewnia przejrzysty i bezpieczny sposób wyświetlania danych logowania bez ujawniania hasła. Metoda __debugInfo() gwarantuje, że poufne informacje pozostaną ukryte nawet podczas debugowania — to kluczowa praktyka podczas pracy z danymi uwierzytelniającymi.

Spróbuj swoich sił

<?php

require_once 'Credential.php';

// Odczytaj dane wejściowe
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));

// TODO: Utwórz instancję Credential z wartościami wejściowymi

// TODO: Wyświetl obiekt credential za pomocą echo (wywołuje __toString())

// TODO: Użyj var_dump() na obiekcie, aby zobaczyć chronione dane debugowania

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online