升级PHP版本后不推荐使用的错误

Deprecated error after upgrade PHP Version

提问人:m2dev 提问时间:10/5/2023 最后编辑:Progmanm2dev 更新时间:10/5/2023 访问量:88

问:

我在PHP中使用了以下公式。它在 PHP 7.4 之前工作正常。现在我已经升级到PHP 8.1,它给出了错误。

<?php
    echo ((float)13.5 + intdiv((float)13.5, (int)10) * (float)2.5 / (int)12);

我收到错误异常:弃用功能:从 float 13.5 到 int 的隐式转换失去精度

我该如何解决这个问题?此错误的原因是什么?

PHP 已弃用 php-8.1

评论

0赞 Ahamed Safnaj 10/5/2023
尝试intdiv((int)(float)13.5, 10)
0赞 Nico Haase 10/5/2023
php.watch/versions/8.1/...包含更多详细信息
3赞 Nico Haase 10/5/2023
另外,为什么要在浮点数上使用?也许它正在“工作”,但它是否也返回了您期望的结果?intdiv

答:

1赞 Stalinko 10/5/2023 #1

问题是函数需要两个类型为:https://www.php.net/manual/ru/function.intdiv.phpintdiv()int

但是你把变量作为第一个参数传递,这会导致隐式类型转换。float

在传递到函数之前,您应该以某种方式将浮点变量转换为。 这边:int

intdiv((int)13.5, 10)

或者这样:

intdiv(round(13.5), 10)

你指定的其余类型没有意义,因为 PHP 会以同样的方式自动计算它。

评论

2赞 IMSoP 10/5/2023
值得注意的是,返回的是一个浮点数而不是一个整数,所以仍然有一个隐式转换在进行,只是PHP知道是安全的。round()
0赞 m2dev 10/5/2023
@IMSoP 你能发布有效和安全的答案吗?
1赞 IMSoP 10/5/2023
@m2dev 什么是“有效”取决于你实际想要实现的目标;正如注释中所指出的,首先将浮点数传递给没有多大意义。本例中的第一个示例等同于您的旧代码,它将 13.5 截断为 13;这是否是你的意图,只有你能回答。intdiv
0赞 Stalinko 10/5/2023
很好的说明@IMSoP你是绝对正确的。从技术上讲,它仍然是 ,但现在它没有分数,因此 PHP 可以安全地将其转换为 。floatint
1赞 IMSoP 10/5/2023
@Stalinko是的,唯一重要的是,如果您处于模式,则在使用 3v4l.org/2A1el 后仍然会出现错误,因此需要将强制转换为 int 显式: 3v4l.org/K05WOstrict_types=1round
2赞 IMSoP 10/5/2023 #2

用争论来称呼没有多大意义,而且可能真的给出了你想要的结果,也可能没有intdivfloat

去掉多余的演员,我们有

(13.5 + intdiv(13.5, 10) * 2.5 / 12)

截断为整数,因此变为:13.5

(13.5 + intdiv(13, 10) * 2.5 / 12)

您可能希望它对值进行四舍五入,从而给出:

(13.5 + intdiv(14, 10) * 2.5 / 12)

对于 13.5 的例子,答案是一样的,但假设这实际上是一个变量,它会为 19.5 给出不同的例子,例如:

echo (13.5 + intdiv(19, 10) * 2.5 / 12); # 13.708333333333
echo (13.5 + intdiv(20, 10) * 2.5 / 12); # 13.916666666667

为了明确起见,您可以先在浮点数上使用 floorround 函数,然后将其转换为 int(因为舍入的结果在技术上仍然是浮点数):

echo (13.5 + intdiv((int)floor(19.5), 10) * 2.5 / 12); # 13.708333333333
echo (13.5 + intdiv((int)round(19.5), 10) * 2.5 / 12); # 13.916666666667