计算不可数对象PHP 7.2

时间:2018-05-14 00:31:08

标签: php

到目前为止,我一直在我的一个旧项目中使用PHP 5.4

最近我决定升级到PHP 7.2

我的项目中有大约800个文件,旧的开发人员团队在项目中使用了count()数百个时间。

PHP 5.4中,即使变量不可数,它仍按预期工作,但在PHP 7.2中会抛出错误。

我可以进入每个文件并更改功能,但这可能会花费大量时间,而且不会在这里和那里改变一些功能。

我可以扩展count()函数并编写代码,使其在PHP 5.4中工作吗?

这个问题还有其他解决办法吗?

我现在将所有count($var)函数的条件替换为is_array($var) && count($var)。{/ p>

谢谢

4 个答案:

答案 0 :(得分:2)

在Python等其他语言中,您可以使用装饰器拦截现有方法,而无需修改原始方法。

然而,PHP不支持装饰器,因此您需要手动更改该调用的每个位置。

答案 1 :(得分:2)

php 5.4和php 7+在这个方面的区别并不是那个改变了它的行为,是php现在把错误变成了可捕获的异常。 在关闭error_repoting的情况下,您的代码在生产时无声地失败。这对于企业来说是非常危险的,因为你的应用程序的一致性是不可靠的,你应该尽快改变。

说完了。由于所有错误都不能通过将error_reporting设置为0来关闭(这是因为现在它们是异常而不是错误,而且非常好,php不再是超级不可靠的语言)。你必须捕获那些ExExtions,它们是ErrorException。

转到您的应用程序的索引文件并添加一个try-catch块并再次将脏污刷到地毯上。

try {
   //super buggy app bootstraping
} catch (ErrorException $ex) {
    error_log($ex);
}

好吧,无论如何,我宁愿修理这些计数,它们也是有毒的。

注意:is_array($ var)&& count($ var)不是一个好主意,因为数组不是php上唯一可数的东西,((is_array($ var)|| $ var instanceof countable)&& count($ var))会更好,但不是完美的解决方案。还要注意任何版本的php中的错误 - count(false) - 返回1

答案 2 :(得分:1)

您可以使用runkit使用您自己的实现重载count()函数:

// to override internal functions, this system INI value needs truthy
assert((bool)ini_get('runkit.internal_override'));

// now you can define your own implementation
runkit_function_redefine('count', function ($var) {
    return ((is_array($var) || $var instanceof \Countable) ? count($var) : 0);
});

但是,请考虑将此作为临时停止间隙来缓解5.4至7.2的痛苦。因为这种方法不透明,所以在某些时候它会成为维护责任,这可能是你不想留下的责任。

此外,请注意,is_array($v) && count($v)的转换不能处理所有可数事项:\Generator\Traversable。但上面的runkit覆盖示例确实处理了它们。

答案 3 :(得分:-1)

修改您的代码,并学习type。确保您的count方法返回可数的内容