__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() メソッドは、オブジェクトに対して 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() の両方のマジックメソッドを実演する、認証情報管理システムを構築しましょう。印刷時にはユーザーフレンドリーな情報を表示し、デバッグ時には機密データを保護するクラスを作成します。
コードは2つのファイルに分けて構成します:
Credential.php— ログイン情報を安全に保存するCredentialクラスを作成します。コンストラクタのプロパティプロモーションを使用して、$username(string)、$password(string)、および$lastLogin(string) のプライベートプロパティを定義します。2つのマジックメソッドを実装してください:__toString()— ユーザーフレンドリーな文字列"User: " . $this->username . " (Last login: " . $this->lastLogin . ")"を返します。文字列形式ではパスワードが決して公開されないことに注意してください。__debugInfo()—var_dump()用の配列を返します。この配列では、ユーザー名をそのまま表示し、パスワードは"[PROTECTED]"と表示してマスクし、最終ログイン日は通常通り表示します。
main.php— Credential ファイルをインクルードします。ユーザー名、パスワード、最終ログイン日の3つの入力を受け取ります。これらの値を使用して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オブジェクトをechoする(__toString()をトリガーする)
// TODO: オブジェクトに対してvar_dump()を使用し、保護されたデバッグ出力を確認する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
8マジックメソッド
マジックメソッド入門__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone とオブジェクトのクローン__serialize & __unserializeまとめ - カスタムコレクション