为什么不可能从__toString()中引发异常?

2022-08-30 11:03:03

为什么不可能从__toString()中引发异常?

class a
{
    public function __toString()
    {
        throw new Exception();
    }
}

$a = new a();
echo $a;

上面的代码产生这样的结果:

Fatal error: Method a::__toString() must not throw an exception in /var/www/localhost/htdocs/index.php on line 12

我被指向描述这种行为 http://php.net/manual/en/migration52.incompatible.php,但为什么呢?有什么理由这样做吗?

也许这里有人知道这一点?

在 bug 跟踪器 php-dev-team 像往常一样什么也没说,但看到手册:http://bugs.php.net/50699


答案 1

经过几次搜索,我发现了这个,上面写着:

Johannes解释说,没有办法确保Zend引擎能够正确处理在强制转换为字符串期间引发的异常,并且除非重写引擎的大部分内容,否则这种情况不会改变。他补充说,过去曾就这些问题进行过讨论,并建议Guilherme检查档案。

上面提到的Johannes是PHP 5.3版本管理器,所以它可能是“官方”的解释,因为你可能会发现为什么PHP会这样表现。

本节接着提到:

__toString()奇怪的是,会接受trigger_error()

因此,在 中的错误报告方面,并非所有内容都会丢失。__toString()


答案 2

我的猜测是,这是黑客行为,因此存在于典型堆栈之外。那么,抛出的异常就不知道该去哪里。__toString


推荐