加入收藏 | 设为首页 | 会员中心 | 我要投稿 海南站长网 (https://www.0898zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP RFC: 允许 __toString () 方法抛出异常

发布时间:2022-11-04 13:31:17 所属栏目:PHP教程 来源:未知
导读: 简介
当前禁止从 __toString() 中引发异常,这将导致致命错误。这使得在 __toString() 中编写任意代码都是危险的,并使其作为通用 API 的使用成为问题。这个 RFC 消除了这个限制。
当前行为

简介

当前禁止从 __toString() 中引发异常,这将导致致命错误。这使得在 __toString() 中编写任意代码都是危险的,并使其作为通用 API 的使用成为问题。这个 RFC 消除了这个限制。

当前行为的基本原理是,在整个引擎和标准库的很多地方都进行了字符串转换,并且并非所有地方都准备 “正确地” 处理异常,因为从某种意义上说,应尽早处理异常。

从技术的角度来看,这种限制最终是徒劳的,因为在字符串转换期间的异常仍然可以被可恢复的错误转换为异常的错误处理程序触发:

[set_error_handler](http://www.php.net/set_error_handler)(function() {
    throw new Exception();
});
try {
    (string) new stdClass;
} catch (Exception $e) {
    echo "(string) threw an exception...\n";
}

事实上,Symfony 使用此漏洞 可以解决当前的限制。不幸的是,这依赖于 $errcontext 参数,该参数在 PHP 8 中已经消失了。

尽管如此,之前这个话题的讨论并没有使这个限制松动,直到我们对该代码库的字符串转换进行全面的审核。这已经在附加的实现中完成。pull request。

提议

允许从__toString() 抛出异常,其行为将和往常一样,不再触发致命错误。

另外,按照 PHP7 建立的错误策略,将 ”could not be converted to string” 和 “__toString () must return a string value” 的致命错误转换为正确的 Error 异常。

扩展准则

扩展作者想要确保他们优雅地处理字符串转换带来的异常,应该考虑以下的准则:

zend_string *str = zval_get_string(val);
if (EG(exception)) {
    // 可能在这里释放其他资源。
    return;
}
-  除此之外,模型转换作为一个容易犯错的操作,提供了许多帮助 API:
// 像 zval_get_string(),但是在转换失败的时候返回 NULL 。
zend_string *str = zval_try_get_string(val);
if (!str) {
    // 可能在这里释放其他资源。
    return;
}
// 主代码
zend_string_release(str);
// 像 zval_get_tmp_string(),但是在转换失败的时候返回 NULL 。
zend_string *tmp, *str = zval_try_get_tmp_string(val, &tmp);
if (!str) {
   // 可能在这里释放其他资源。
    return;
}
// 主代码
zend_tmp_string_release(tmp);
// 像 convert_to_string() ,但是在转换成功/失败的时候返回布尔值。
if (!try_convert_to_string(val)) {
     // 可能在这里释放其他资源。
    return;
}
// 主代码。

PHP最全面试题:(记得看到最后)

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家PHP错误处理,需要的可以加入我的官方群点击此处。

(编辑:海南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!