如何使date类在5.6.17和5.6.23上显示相同的结果


How to make Date-class to show the same results on 5.6.17 and 5.6.23

首先我意识到这个问题: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()
  • 使代码的意图更清晰

缺点:

  • 必须找到所有出现的
  • 人们需要记住这一点
结论

在我看来,最后一个选项是最好的,因为它使你的代码保持干净,易于扩展和易于测试。最重要的是,它的目击程度最低。