PHP中现有的类名冲突,需要一个创造性的解决方案

时间:2009-08-18 11:45:25

标签: php namespaces

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

我正在与其他人的代码库合作。他们必须使用较旧版本的PHP,其中不存在DateTime类,因此它们包含一个添加Time,Date和DateTime类的开源库。好吧,我将它部署到客户端的服务器上,并且已经定义了这个类。为了解决它导致的崩溃,我添加了一个“if class not defined”检查,但是看起来(正如你所期望的)类的api不完全相同,并且代码中的某个地方可能或者可能不要使用所使用语言版本中包含的DateTime类的未定义方法。

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

感谢。

5 个答案:

答案 0 :(得分:3)

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

这不是一个“仅限一个地方”的解决方案,但是,至少你不必替换每个类的引用,只需引用文件开头的命名空间。

希望这有帮助。

答案 1 :(得分:3)

这里有一些好主意......

使用命名空间 - 由Petruza建议 - 可能是处理它的最好方法......但它只是PHP 5.3。

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

或者,如果让系统联机是最重要的,您可以在之后重构它,您可以重命名该类及其所有引用。通过向DateTime添加前缀 - company_DateTime - 您可以用旧方式命名它,并且您的类应该毫无困难地共存。当然,如果你不得不很快更新支持库,这将使生活变得更加困难,所以不要盲目地跳进这个...

答案 2 :(得分:1)

也许这可以提供帮助:Unload dynamic class in PHP

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

嗯,这个解决方案非常难看,应该只作为最后的手段使用。例如,在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 OriginalClassName()使用新的类名new ModifiedClassName()