首页 后端开发 PHP7 PHP 7.4允许从 __toString() 抛出异常

PHP 7.4允许从 __toString() 抛出异常

Nov 30, 2019 pm 02:41 PM
PHP 7.4

PHP 7.4允许从__toString() 抛出异常(Allow Exceptions from __toString())

介绍

目前禁止从__toString()抛出异常,并将导致致命错误。这就使得调用任意代码变得很危险,并使其成为一个有问题的通用API。此RFC旨在取消此限制。

当前行为的基本原理是,在整个引擎和标准库的许多地方都执行了字符串转换,并不是所有地方都准备“正确地”处理异常,即尽可能早地处理异常。

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

set_error_handler(function() {
    throw new Exception();
});
 
try {
    (string) new stdClass;
} catch (Exception $e) {
    echo "(string) threw an exception...\n";
}
登录后复制

事实上,Symfony利用这个漏洞来绕过当前的限制。不幸的是,这依赖于$errcontext参数,它在PHP 8中消失了.

尽管如此,在我们对该代码库中的字符串转换进行了全面审核之前,过去关于该主题的讨论一直没有放松这种限制。这已在附加的实现请求中完成。

建议

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

另外,将“不能转换为字符串”和“__toString()必须返回一个字符串值”可恢复的致命错误转换为正确的错误异常,这与PHP 7中建立的错误策略一致。

扩展准则

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

● 如果zval_get_string()、convert_to_string()和friends生成一个异常,它们仍然会生成一个字符串。这个字符串被保证是暂存的。这意味着没有必要释放它,但可以这样做。在上下文中,您可以选择更方便的选项。

● 如果从对象到字符串的转换失败,则字符串转换的结果将为空字符串,如果将数组转换为字符串,并且错误处理程序将结果通知提升为异常,则为“Array”。(这种行为和以前一样。)

● 通常情况下,使用通常的if (EG(exception))检查来检查是否抛出了异常就足够了:

zend_string *str = zval_get_string(val);
if (EG(exception)) {
    // Possibly free other resources here.
    return;
}
登录后复制

除此之外,还提供了一些帮助api,将转换建模为容易出错的操作:

// Like zval_get_string() but returns NULL on conversion failure.
zend_string *str = zval_try_get_string(val);
if (!str) {
    // Possibly free other resources here.
    return;
}
// Main code.
zend_string_release(str);
 
 
// Like zval_get_tmp_string() but returns NULL on conversion failure.
zend_string *tmp, *str = zval_try_get_tmp_string(val, &tmp);
if (!str) {
    // Possibly free other resources here.
    return;
}
// Main code.
zend_tmp_string_release(tmp);
 
 
// Like convert_to_string() but returns a boolean indicating conversion success/failure.
if (!try_convert_to_string(val)) {
    // Possibly free other resources here.
    return;
}
// Main code.
登录后复制

如果转换失败,try_convert_to_string()将不会修改原始值。因此,使用它比使用convert_to_string()和异常检查更安全。

虽然检查每一个字符串转换肯定会使您处于安全的一方,但忽略这些检查通常只会导致一些不必要的计算和可能的冗余警告。您应该注意的主要事情是修改持久结构(如数据库)的操作。

不向后兼容的变更

从可恢复的致命错误到错误异常的转换在技术上是BC中断的。

翻译:https://wiki.php.net/rfc/tostring_exceptions

以上是PHP 7.4允许从 __toString() 抛出异常的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)