所以这里的错误信息很简单,但我不知道为什么会发生这种情况。刚刚升级到PHP 8,并试图通过修复弃用来工作。
我有$object
,它看起来像这样(所有字符串键):
Array
(
[a] => ABC
[b] => 599.97
[c] => 0.00
[d] => 50
[e] => Test
)
我有$field
,当我做var_dump($field)
时,我得到了float(1.05)
在我的代码中,发生了以下情况:我想检查$field
是否是$object
的一个有效键。如果是的话,我想通过键使用访问的值,如果不是,我想使用$field
作为值。
因此,我有以下代码:
$a = $object[$field] ?? $field;
然而,正是这一行代码触发了以下警告:
DEPRECATED | PID: 6978 | CODE: 8192 | MESSAGE: Implicit conversion from float 1.05 to int loses precision
我想这可能与空合并有关,但这段代码也会触发同样的警告:
$a = $object[$field];
请注意,这里的$a
只是一个未使用的随机变量,我没有在其他地方键入提示或声明,当我使用这个虚拟变量时,警告仍然发生。
为什么会发生这种情况?这里是如何隐式转换到int
的?我都快疯了想要解决这个问题。
发布于 2022-05-18 19:12:54
从手册 (强调地雷)-
此外,还将发生以下键转换: ..。 浮点数也被转换为int,这意味着小数部分将被截断。密钥8.7实际上将存储在8.下面。 ..。
发布于 2022-05-18 20:29:03
在PHP数组中,键可以是int或string。其他每一种类型都需要转换为其中的一种。
当您执行$object[1.05]
时,它在内部将该值转换为int,因此它执行$object[1]
,但是这种行为可能会误导您,因此从PHP8.1开始您就会收到警告。
https://stackoverflow.com/questions/72294648
复制相似问题