【问题标题】:Existing class name clash in PHP, need a creative solutionPHP中现有的类名冲突,需要一个创造性的解决方案
【发布时间】:2009-08-18 11:45:24
【问题描述】:

我意识到你不能在 PHP 中“取消声明”或“重新声明”一个类,我也不能像在 C# > 3.0 中那样使用扩展方法。所以,这是我的情况。

我正在使用其他人的代码库。他们一定是在使用稍旧的 PHP 版本,其中不存在 DateTime 类,因此他们包含了一个开源库,其中添加了 Time、Date 和 DateTime 类。好吧,我去把这个部署到客户端的服务器上,这个类已经定义好了。为了解决它导致的崩溃,我添加了一个“如果未定义类”检查,但是似乎(如您所料)类的 api 并不完全相同,并且在代码中的某个地方可能会或可能会不要使用所用语言版本中包含的 DateTime 类的未定义方法。

有没有办法卸载一个类,或者你能想到的任何创造性的方法来解决这个问题。我宁愿不必在所有文件中搜索所有引用,也不必重命名该类。这听起来很乱,但我想这可能是我唯一的选择。我更喜欢只在一个地方进行的修复。

谢谢。

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    您可能希望将类定义包含在命名空间中。然后在每个使用当前 DateTime 类的文件中声明一个“使用命名空间 xxx”(我不记得确切的 PHP 语法)。

    这并不完全是“一个地方和一个地方”的解决方案,但是,至少您不必替换对类的每个引用,只需引用文件开头的命名空间即可。

    希望这会有所帮助。

    【讨论】:

    • 这仅适用于 PHP >= 5.3,尚未广泛使用
    • 它仍然是一个可以查看的选项,尤其是如果它是一个显示停止器,否则......
    【解决方案2】:

    这里有一些好主意...

    使用命名空间 - 由 Petruza 建议 - 可能是处理它的最佳方式...但它仅适用于 PHP 5.3。

    另外,Robert 关于重构代码的建议是一个合理的想法,但可能会花费大量时间和精力。由于这最终必须完成,因此您可能想要这样做。

    或者,如果让系统联机是重中之重,并且您可以在之后对其进行重构,那么您也许可以重命名该类以及对它的所有引用。通过添加前缀 - DateTimecompany_DateTime - 您以旧方式对其进行命名空间,并且您的类应该可以毫无困难地共存。当然,如果您必须尽快更新支持库,这会让生活变得更加困难,所以不要盲目地跳入这个......

    【讨论】:

      【解决方案3】:

      也许这会有所帮助:Unload dynamic class in PHP

      【讨论】:

        【解决方案4】:

        我会尝试将代码库迁移到更新版本的 PHP。如果您打算在新的 PHP 版本上使用生产中的代码,那么无论如何您都需要在该版本上对其进行测试。如果您不想投入精力更新和测试代码库,您可能应该要求在目标系统上安装旧版本。否则你无法保证你的代码可以正常工作。

        使用适当的工具搜索大量文件并识别所有这些类的出现并不难。

        【讨论】:

          【解决方案5】:

          嗯,这个解决方案真的很丑,只能作为最后的手段使用。例如,在 Opencart 中,“admin”和“catalog”的 Category 类都具有相同的类名,如果你想在同一个代码段中同时使用这两个类,那是一项非常困难的任务。因此,一种解决方法是重命名您要包含的类。像这样的:

          $file = file_get_contents("path/to/file.php");
          $file = str_replace("OriginalClassName", "ModifiedClassName", $file);
          
          // must remove <?php tag from the beginning
          eval(substr($file, 5));
          

          然后用新的类名new ModifiedClassName()代替new OriginalClassName()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-07-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-17
            • 2023-03-22
            相关资源
            最近更新 更多