はじめに
PHPでオブジェクトを文字列に変換する際に活躍するのが __toString()
マジックメソッド です。さらにPHP8からは、Stringable
というインターフェースが追加され、__toString()
を持つクラスを型で表現できるようになりました。この記事では、試験対策の観点から「実行結果の確認」と「Stringableの役割」を整理して解説します。
目次
__toString()とは?
__toString()
は オブジェクトが文字列に変換されるときに呼ばれるマジックメソッド です。
class Hoge {
public function __toString(): string {
return "Hello from __toString()";
}
}
$obj = new Hoge();
echo $obj; // Hello from __toString()
これを定義しないと echo $obj;
のようにしたとき、エラーになります。
Stringableインターフェースとは?
PHP8で追加された組み込みインターフェースです。定義はシンプルに以下のようなイメージになっています。
interface Stringable {
public function __toString(): string;
}
つまり「__toString()
を持つクラスは Stringable とみなせる」仕組みです。
これにより、型ヒントに Stringable を指定できるようになりました。
function printString(Stringable $s) {
echo $s;
}
変換の流れを図で理解しよう
オブジェクトを (string)
にキャストしたり echo
で表示するとき、内部的には以下のような流れで __toString()
が呼び出されます。
+------------------+
| オブジェクト |
| (Hoge $obj) |
+------------------+
|
v
(string) $obj または echo $obj
|
v
+-----------------------+
| __toString() 呼び出し|
+-----------------------+
|
v
+-------------------------------+
| 文字列として出力 |
| "to string Hoge::__toString" |
+-------------------------------+
この流れを理解しておくと、試験での混乱が減ります。
実際のコード例
問題集にある次のコードを見てみましょう。
declare(strict_types=1);
error_reporting(-1);
class Hoge implements Stringable {
public function __toString(): string {
return "to string " . __METHOD__;
}
}
$obj = new Hoge();
var_dump((string)$obj);
実行結果:
string(26) "to string Hoge::__toString"
これは 正しい結果 です。
(string)$obj
によって__toString()
が呼ばれる__METHOD__
は"Hoge::__toString"
を返す- 文字列結合され
"to string Hoge::__toString"
になる
よくある誤解ポイント
- 「implements Stringable は必須?」 → いいえ、必須ではありません。
PHP8では__toString()
を持つクラスは自動的に Stringable として扱われます。 - ただし 「このクラスはStringableです」と明示する場合 には
implements Stringable
を書くこともできます。
試験対策ポイント
__toString()
は戻り値が string型必須- 例外を投げると Fatal error になる(try-catchでは扱えない)
- PHP8からは
Stringable
が導入され、__toString()
を持つクラスは自動的に型チェック可能
まとめ
__toString()
→ オブジェクトを文字列に変換するためのマジックメソッドStringable
→ PHP8で追加。__toString()
を持つクラスを型で扱うためのインターフェース- 実行結果
"to string Hoge::__toString"
は正しい
試験では「implements Stringable
は必須か?」という引っかけに注意しましょう!