Menu
Coddy logo textTech

__toString と __debugInfo

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 45/91。

__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() method は、object に対して 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() の両方の magic method を示す credential management system を構築しましょう。印刷時にはユーザーにわかりやすい情報を表示し、デバッグ時には機密データを保護する class を作成します。

コードを2つのファイルに整理します。

  • Credential.php:login 情報を安全に保存する Credential class を作成します。constructor promotion を使用して、$username(string)、$password(string)、$lastLogin(string)の private properties を定義します。2つの magic method を Implement します。
    • __toString():ユーザーにわかりやすい文字列 "User: [username] (Last login: [lastLogin])" を返します。文字列表現に password が決して公開されないことに注目してください。
    • __debugInfo()var_dump() 用の array を返します。username はそのまま表示し、password は "[PROTECTED]" のみを表示してマスクし、last login の日付は通常どおり表示します。
  • main.php:Credential ファイルを Include します。username、password、last login の日付という3つの入力を受け取ります。これらの値で Credential instance を作成します。まず credential object を直接 echo します(これにより __toString() が呼び出されます)。次に新しい行で、object に対して var_dump() を使用し、保護された 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オンラインコンパイラ