__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.
Wyzwanie
ŁatwyZbudujmy 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ę dlavar_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ęCredentialz tymi wartościami. Najpierw wypisz bezpośrednio obiekt danych logowania (to wywołuje__toString()). Następnie, w nowym wierszu, użyjvar_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
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online