Menu
Coddy logo textTech

__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은 숨겨지고 계좌 번호는 부분적으로 마스킹되어 안전한 디버깅에 완벽합니다.

challenge icon

챌린지

쉬움

__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()를 사용하여 보호된 디버그 출력 확인

?>
quiz icon실력 점검

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

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