《PHP8上級試験対策》__toString()とStringableインターフェースの関係をわかりやすく解説

  • URLをコピーしました!

はじめに

PHPでオブジェクトを文字列に変換する際に活躍するのが __toString() マジックメソッド です。さらにPHP8からは、Stringable というインターフェースが追加され、__toString() を持つクラスを型で表現できるようになりました。この記事では、試験対策の観点から「実行結果の確認」と「Stringableの役割」を整理して解説します。

キーワード: __toString / Stringable / マジックメソッド / 型ヒント / PHP8新機能

目次

__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 は必須か?」という引っかけに注意しましょう!

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次