包含具有重复类的文件

Posted

技术标签:

【中文标题】包含具有重复类的文件【英文标题】:Include file with duplicate class 【发布时间】:2015-10-05 09:10:44 【问题描述】:

我想包含一个文件,该文件包含我的应用程序中已存在的类。显然这会导致:

php Fatal error:  Cannot redeclare class XYZ

由于我不会进入这里的原因,我无法更改相关文件的代码,也无法更改包含原始类的文件。出于这个原因,我不认为命名空间是一种选择——尽管我对这个概念有点陌生,所以我可能是错的。

有没有办法动态更改正在读取的文件的内容以即时更改类名声明? 我能否以某种方式销毁或取消包含已存在的重复类?

我意识到这不太可能是干净的。欢迎任何关于解决方法的想法,无论多么丑陋。

【问题讨论】:

如果重命名类,调用者将不知道使用新名称。如果你销毁已经存在的副本,它的所有调用者会发生什么?这就是创建类命名空间来解决的问题。 我认为你不能取消声明。您可能需要创建一个namespace @Barmar - 我认为这两件事都不是问题。我只需要访问类方法。如果需要,我可以重新加载原始类。 @Rasclatt - 我非常了解如何使用命名空间来完成这项工作。它是否需要在类声明本身中发生?如果是这样,那将无济于事,因为我无法修改包含的文件。如果没有,请告知。 sitepoint.com/php-53-namespaces-basics 有教程。你可以把你自己的类放在一个命名空间里,这样就不会和你不能修改的文件冲突了。 【参考方案1】:

我将根据 cmets 中提到的想法在这里回答我自己的问题。

$path = "/path/to/include/file.php";
$className = "OriginalClassname";
$tempClass = "ReplacementClassname";

$buffer = file_get_contents($file);
$buffer = str_replace($className,$tempClass,$buffer);
$file = 'temp.php';
file_put_contents($file, $buffer);
include_once($file);
unlink($file);

简而言之:

将文件读取到变量中 替换类名 将变量写入临时文件 包含临时文件 删除临时文件

工作就像一个魅力。

【讨论】:

以上是关于包含具有重复类的文件的主要内容,如果未能解决你的问题,请参考以下文章

使用css替换具有不一致类的表行颜色的方法[重复]

从使用 jQuery 的代码中指定的元素中选择具有给定类的下一个元素

Jquery根据用户输入选择包含多个类的元素[重复]

从嵌套类到包含类的 C# 成员访问 [重复]

如何选择页面上的所有表,除非它们包含具有特定类的行

具有包含另一个类的函数指针的映射的类