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
相关产品推荐
相关产品推荐

