在 Php 中,我希望我的异常不可变:
readonly class MyImmutableException extends \Exception
{
}
如您所见,这是不可能的,它会导致致命错误,因为 \Exception 不是不可变的。 但我想让我的所有系统都不可改变,所以很糟糕
你不能像现在那样这样做。它是设计的一部分,在只读类的 RFC 的“继承”部分中提到过:
与重写只读属性的工作原理类似,只读类只能扩展只读父级。因此,您要么继续继承
\Exception
类,要么应用只读属性。请注意,您可能根本不需要延长
\Exception
。创建自己的异常基类应该足够了,具有
readonly
属性,只要它实现\Throwable 契约,你就应该可以很好地滚动。您可以安全地复制
\Exception
代码,这样就不会重新发明轮子。
class MyImmutableException extends \Exception
{
public function __construct(){
parent::__construct();
}
}
如果您确实需要,也可以定义一些默认值。如果您没有任何设置器,则没有人可以更改它:
class MyImmutableException extends \Exception
{
private const MESSAGE = 'I am an example';
private const CODE = 123;
public function __construct(){
parent::__construct(
self::MESSAGE,
self::code
);
}
}