__toString 및 __debugInfo
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 45번째.
__toString() 메서드는 객체를 문자열로 표현하는 방법을 정의할 수 있게 해줍니다. 이는 echo나 문자열 연결과 같이 객체를 문자열 컨텍스트에서 사용할 때 자동으로 호출됩니다.
<?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)__debugInfo() 메서드는 객체에 대해 var_dump()를 사용할 때 어떤 정보가 표시될지를 제어합니다. 이는 디버깅 중에 민감한 데이터를 숨기거나 계산된 값을 표시하는 데 유용합니다:
<?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);
출력 결과:
object(BankAccount)#1 (3) {
["accountNumber"]=>
string(8) "****7890"
["balance"]=>
float(1500)
["pin"]=>
string(8) "[HIDDEN]"
}__debugInfo()가 기본 속성 덤프를 대체하는 키-값 쌍의 배열을 어떻게 반환하는지 확인해 보세요. 민감한 PIN은 숨겨지고 계좌 번호는 부분적으로 마스킹되어 안전한 디버깅에 완벽합니다.
챌린지
쉬움__toString()와 __debugInfo() 매직 메서드를 모두 시연하는 자격 증명 관리 시스템을 구축해 보겠습니다. 출력할 때는 사용자 친화적인 정보를 표시하면서, 디버깅 중에는 민감한 데이터를 보호하는 클래스를 만들게 됩니다.
코드는 두 개의 파일로 구성됩니다:
Credential.php— 로그인 정보를 안전하게 저장하는Credential클래스를 생성합니다. 생성자 프로모션(constructor promotion)을 사용하여$username(string),$password(string),$lastLogin(string)에 대한 private 속성을 정의하세요. 다음 두 가지 매직 메서드를 구현합니다:__toString()— 사용자 친화적인 문자열을 반환합니다:"User: [username] (Last login: [lastLogin])". 문자열 표현에는 비밀번호가 절대 노출되지 않도록 주의하세요.__debugInfo()—var_dump()를 위한 배열을 반환합니다. 이 배열은 username을 그대로 보여주고, password는"[PROTECTED]"로 마스킹하여 표시하며, 마지막 로그인 날짜는 정상적으로 표시해야 합니다.
main.php— Credential 파일을 포함합니다. 사용자 이름, 비밀번호, 마지막 로그인 날짜라는 세 가지 입력을 받게 됩니다. 이 값들로Credential인스턴스를 생성하세요. 먼저 자격 증명 객체를 직접 echo 하세요 (이것이__toString()을 트리거합니다). 그런 다음 새 줄에서 객체에var_dump()를 사용하여 보호된 디버그 출력을 확인하세요.
__toString() 메서드는 비밀번호를 노출하지 않고 자격 증명을 표시하는 깨끗하고 안전한 방법을 제공합니다. __debugInfo() 메서드는 디버깅 중에도 민감한 정보가 숨겨지도록 보장하며, 이는 인증 데이터를 다룰 때 매우 중요한 관행입니다.
치트 시트
__toString() 메서드는 echo 또는 문자열 연결과 함께 사용될 때 객체가 문자열로 표현되는 방식을 정의합니다:
<?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)
__debugInfo() 메서드는 객체에 var_dump()를 사용할 때 표시되는 정보를 제어합니다. 표시할 키-값 쌍의 배열을 반환합니다:
<?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);
// 마스킹된 계좌 번호와 숨겨진 PIN을 표시합니다
이러한 메서드들은 민감한 데이터를 숨기거나 다양한 상황에 맞춰 객체 출력을 커스터마이징하는 데 유용합니다.
직접 해보기
<?php
require_once 'Credential.php';
// 입력 읽기
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: 입력된 값으로 Credential 인스턴스 생성
// TODO: credential 객체 출력 (__toString() 호출)
// TODO: 객체에 var_dump()를 사용하여 보호된 디버그 출력 확인
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션