到目前为止,我一直在我的一个旧项目中使用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>
谢谢
答案 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
方法返回可数的内容