You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP strict_types模式下类型转换疑问:为何未触发TypeError?

为什么开启strict_types=1后传入整数给float参数不会抛出TypeError?

这其实是PHP严格类型模式下的一个特殊例外规则,我来给你拆解清楚:

首先,开启declare(strict_types=1)后,PHP会对函数的标量类型声明进行严格检查——通常情况下,传入参数的类型必须和声明的类型完全匹配,否则会抛出TypeError。但有一个关键的例外:整数可以被安全地传递给声明为float类型的参数,即使在严格模式下也不会报错,PHP会自动将整数转换为浮点数来处理。

回到你的代码:

<?php declare(strict_types=1); 
function multiply(float $a, float $b): float { 
    return (double)$a * (double)$b; 
} 
$six = multiply(2, 3); 
echo gettype($six); //output: double

你传入的2和3是整数类型,但因为目标参数是float,触发了这个例外规则,PHP自动把它们转换成了浮点数,所以函数正常执行,最终返回的结果类型是double(PHP里float和double是同一个类型,gettype()会返回double)。

反过来的情况会报错

如果把规则反过来,你声明一个接受int类型参数的函数,然后传入浮点数(比如2.5),在严格模式下就会立刻抛出TypeError,因为浮点数转整数可能丢失精度,属于不安全转换:

<?php declare(strict_types=1);
function add(int $a, int $b): int {
    return $a + $b;
}
add(2.5, 3); // 这里会抛出 TypeError: Argument 1 passed to add() must be of the type int, float given

这个例外规则的设计逻辑很简单:整数到浮点数的转换是无损且安全的(不会丢失任何精度),而浮点数转整数则可能丢失小数部分,所以PHP在严格模式下允许前者,禁止后者。

内容的提问来源于stack exchange,提问作者Umut Savas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:17:10