在 php 8.0 及以上版本中,开启 strict_types 后如果传入错误的类型,程序会直接抛出 typeerror 异常。这是一个致命的运行时错误,会导致脚本中断执行,除非你使用 try-catch 块进行捕获处理。

严格模式的工作原理
默认情况下,PHP 是一种弱类型语言,它会在赋值时尝试将值转换为预期的类型。例如,如果函数期望一个整数,而你传入了字符串 "123",PHP 会自动将其转换为整数 123。这种行为虽然灵活,但容易掩盖逻辑错误。

当你在文件顶部添加 declare(strict_types=1); 指令后,PHP 会关闭这种隐式转换。此时,如果传入的参数类型与函数签名中定义的严格类型不符,解释器不会尝试转换,而是立即抛出 TypeError。这有助于在开发阶段尽早发现类型错误,提高代码的健壮性。
实际代码演示
以下是一个完整的示例,展示了如何定义严格类型函数并处理可能抛出的 TypeError。
<?php // 启用严格类型检查
declare(strict_types=1);
// 定义一个期望整数的函数
function addNumbers(int $a, int $b): int {
return $a + $b;
}
// 尝试传入字符串,这将触发 TypeError
try {
// 注意:这里传入的是字符串 "5" 和 "10"
$result = addNumbers("5", "10");
echo "结果: " . $result . "\n";
} catch (TypeError $e) {
echo "发生错误: " . $e->getMessage() . "\n";
}
// 正确的调用方式
$correctResult = addNumbers(5, 10);
echo "正确结果: " . $correctResult . "\n";
?>
运行上述代码时,第一次调用 addNumbers("5", "10") 会抛出 TypeError,因为字符串不能严格转换为整数。程序会进入 catch 块并输出错误信息。第二次调用传入真正的整数,则正常执行并输出结果。你可以将此代码保存为 test.php,然后在命令行运行 php test.php 查看效果。
数组类型的特殊处理
在处理数组参数时,strict_types 的行为同样严格。如果函数签名定义为 array $arr,你必须传入一个数组。如果你不小心传入了一个对象(即使该对象实现了 ArrayAccess 接口),也会抛出 TypeError。这是因为对象和数组在 PHP 中是不同的类型,即使它们可以以类似的方式访问元素。

因此,在使用严格类型时,务必确保传入的数据结构与函数签名完全匹配。对于复杂的嵌套结构,建议使用类或结构体来封装数据,而不是依赖数组,这样可以提供更强的类型安全和更好的代码可维护性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











