__toString
__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();