Menu
Coddy logo textTech

__toString 및 __debugInfo

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 45번째.

__toString() method를 사용하면 object가 문자열로 어떻게 표현될지 define할 수 있습니다. 이는 echo 또는 문자열 연결처럼 문자열 컨텍스트에서 object를 사용할 때 자동으로 호출됩니다.

<?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() method는 객체에 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()가 기본 속성 덤프를 대체하는 키-값 쌍의 array를 반환한다는 점에 주목하세요. 민감한 PIN은 숨겨지고 account number는 일부가 마스킹됩니다. 안전한 디버깅에 안성맞춤입니다.

challenge icon

챌린지

쉬움

__toString()__debugInfo() 매직 메서드를 모두 보여 주는 Credential 관리 시스템을 만들어 보겠습니다. 출력할 때 사용자에게 친숙한 정보를 표시하면서, 디버깅 중에는 민감한 데이터를 보호하는 class를 만들게 됩니다.

코드를 두 개의 파일로 구성합니다:

  • Credential.php: login 정보를 안전하게 저장하는 Credential class를 만듭니다. 생성자 프로모션을 사용하여 $username(string), $password(string), $lastLogin(string)에 대한 private properties를 정의합니다. 두 개의 매직 메서드를 Implement합니다:
    • __toString(): 사용자에게 친숙한 문자열인 "User: [username] (Last login: [lastLogin])"을 Return합니다. 문자열 표현에는 password가 절대 노출되지 않는다는 점에 유의하세요.
    • __debugInfo(): var_dump()를 위한 array를 Return합니다. username은 그대로 표시하고, password는 "[PROTECTED]"만 표시하여 마스킹하며, last login 날짜는 일반적으로 표시합니다.
  • main.php: Credential 파일을 포함합니다. username, password, last login 날짜라는 세 가지 inputs를 받습니다. 이 값들로 Credential instance를 만듭니다. 먼저 Credential object를 직접 echo합니다(이렇게 하면 __toString()이 실행됩니다). 그런 다음 새 줄에서 object에 var_dump()를 사용하여 protected debug output을 확인합니다.

__toString() method는 password를 노출하지 않고 Credential을 깔끔하고 안전하게 표시하는 방법을 제공합니다. __debugInfo() method는 디버깅 중에도 민감한 정보가 hidden 상태로 유지되도록 보장합니다. 이는 authentication data를 다룰 때 중요한 실천 방법입니다.

직접 해보기

<?php

require_once 'Credential.php';

// 입력 읽기
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));

// TODO: 입력 값으로 Credential 인스턴스 생성

// TODO: credential 객체를 echo ( __toString() 트리거)

// TODO: 객체에 var_dump()를 사용하여 보호된 디버그 출력 확인

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러