首先我意识到这个问题:PHP日期错误。最终在PHP 5.6.23上解决了这个问题。因此,当我将一些服务器从PHP 5.6.17移动到PHP 5.6.23时,我希望所有服务器上的行为都是正确的。但是这个项目是巨大的,所以用版本检查来改变所有date类的用法是有点开销的,因为它必须是一个临时的方法。
问题是:
- 是否有一种方法可以在symfony2项目上使用版本检查覆盖日期类,因此它可能是根点,我可以删除它?
-
我可以以某种方式记录意外行为(一些一般决定,如
-
如果不可能,你可以自由地提出其他建议
在我看来,你基本上有三个选择。都有缺点和优点。
Monkey使用uopz:
修补函数/方法// first backup the original method
uopz_backup ('DateTime::class, 'methodToOverwrite');
// delete the original method
uopz_delete('DateTime::class, 'methodToOverwrite');
// override the method
uopz_function('DateTime::class, 'methodToOverwrite', function($arg) {
// do customn stuff like check for versions and handling them differently here
if (version_compare(PHP_VERSION, '5.6.23', '<')) {
// fix stuff
return fixedstuff;
}
return default stuff;
});
// once you are done with your code restore the original method
uopz_restore ('DateTime::class, 'methodToOverwrite');
优点:
- 不需要修改上面的代码
- 代码 集中存放位置
缺点:
- 高目击级别,因为该方法所做的事情超出了人们的期望
- 你需要解析并正确处理你在方法 中期望的任何内容
- 依赖于非默认扩展名
- 在每个实例中总是有两个测试路径
手动修复每个实例:
这将涉及到在你的所有代码中使用版本检查语句。
优点:
- 查看代码 就知道发生了什么
缺点:
- 必须找到所有出现的
- 有(可能)很多(相同的)版本检查如果语句散落在你的代码
- 人们需要记住这一点
将问题抽象到一个专用的函数/类中:
听起来有问题的事情是你经常做的事情。因此,最好将其抽象为将其放入函数/类中。
优点:
- 可以很容易地进行单元测试,只需测试函数/类
- 隐藏复杂性和版本if语句
- 通过使用特定的方法
YourDate::getFirstTuesdayOfWeek()
使代码的意图更清晰
缺点:
- 必须找到所有出现的
- 人们需要记住这一点
在我看来,最后一个选项是最好的,因为它使你的代码保持干净,易于扩展和易于测试。最重要的是,它的目击程度最低。