PHP
例外
__toString

__toString()での例外処理

More than 1 year has passed since last update.


__toString


__toString() メソッド内から例外を投げることはできません。そうした場合、致命的なエラーが発生します。


http://php.net/manual/ja/language.oop5.magic.php#object.tostring

これでは困ります。


trigger_error

メソッドをprivateメソッドに変更し(例えばtoString )、try-catchで呼び出しエラーに変換します。

public function __toString()

{
try {
return $this->toString();
} catch (\Exception $e) {
trigger_error($e->getMessage() . PHP_EOL . $e->getTraceAsString(), E_USER_ERROR);
return '';
}
}


テスト

phpunitは__toStringでのエラー発生は例外に変換しないので通常の例外に変換されたPHPエラーを期待するテストはうまくいきません。下記のように一時的にset_error_handlerをセットして記述できます。

$errNo = $errStr = '';

set_error_handler(function (int $no, string $str) use (&$errNo, &$errStr) {
$errNo = $no;
$errStr = $str;
});
// __toStringで例外発生させる
$this->assertSame(256, $errNo);
$this->assertContains('foo', $errStr);
// ハンドラー復帰
restore_error_handler();