迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > PHP >

PHP TypeError 内部函数的一致类型错误

作者:迹忆客 最近更新:2023/02/01 浏览次数:

对于用户定义的函数,传递非法类型的参数会导致 TypeError。 对于内部函数,其行为取决于多种因素,但默认是抛出警告并返回 null。 该 RFC 建议始终为所有无效参数类型生成 TypeError 异常,无论函数是用户定义的还是扩展定义的。

首先,对当前行为的详细描述是有序的。 对于无效类型的用户函数参数,无论 strict_types 选项如何,总是会导致 TypeError:

function foo(int $bar) {}
foo("not an int");
// TypeError: Argument 1 passed to foo() must be of the type int, string given

上述代码错误情况如下所示

php fatal error TypeError

当然,strict_types 改变了哪些值被认为与某种类型兼容,但它不会修改错误报告机制。 对于内部函数,基本的行为是抛出警告并返回 null:

var_dump(strlen(new stdClass));
// Warning: strlen() expects parameter 1 to be string, object given
// NULL

上述代码产生的错误情况如下所示

php warning typeerror

null 返回值只是大多数函数遵循的约定。 还有大约 150 个函数会返回 false。 但是,如果启用了 strict_types,则会生成 TypeError,这与用户定义的函数一致:

declare(strict_types=1);
var_dump(strlen(new stdClass));
// TypeError: strlen() expects parameter 1 to be string, object given

上面代码产生的错误如下所示

php fatal error strlen typeerror

此外,有些函数会选择始终生成 TypeError,而不管 strict_types 设置如何。 所有构造函数都是这种情况,因为它们没有返回空值的有意义的方式。 其他函数,例如 random_int 或整个 sodium 扩展,也可以选择抛出。 新引入的方法通常会这样做,以便在所有错误条件下始终抛出异常。

最后,报告错误的方式取决于检测到违规的机制。 以上描述适用于内部函数通常使用的 zend_parse_parameters/ZEND_PARSE_PARAMETERS API。 但是,函数可以另外指定参数信息(通过反射提供)。 如果参数信息指定了类型,那么违反这些将始终导致 TypeError。

这可能导致错误行为取决于哪个参数无效的特殊情况:

var_dump(DateTime::createFromFormat(new stdClass, "foobar"));
// Warning: DateTime::createFromFormat() expects parameter 1 to be string, object given
// bool(false)
 
var_dump(DateTime::createFromFormat("foobar", "foobar", new stdClass));
// TypeError: Argument 3 passed to DateTime::createFromFormat() must be an instance of DateTimeZone or null, instance of stdClass given

在前一种情况下,zend_parse_parameters 检测到类型不匹配并导致警告和错误,在后一种情况下,参数信息检测到类型不匹配并导致 TypeError。 都是为了同一个功能。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 PHP 中获取时间差的分钟数

发布时间:2023/03/29 浏览次数:183 分类:PHP

本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。

PHP 中的重定向

发布时间:2023/03/29 浏览次数:136 分类:PHP

本教程演示了如何将用户从页面重定向到 PHP 中的其他页面

PHP 分页

发布时间:2023/03/29 浏览次数:66 分类:PHP

本教程介绍如何在 PHP 中对数据库行进行分页

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便