使用两个同名的类

时间:2010-12-29 15:05:23

标签: php class namespaces conflict

我有两个PHP应用程序,它们具有相同名称的twho类。   - 带有“Project”类的app1   - 具有“项目”类的app2

我必须在第二个应用程序中使用第一个应用程序的类,但是两个带有一个名称的类会导致错误(“PHP致命错误:无法重新声明类Project ...”)。

我无法更改班级名称。 我必须使用PHP 5.2(PHP 5.2中没有命名空间)。

有解决方案吗?

可能是:

  • 使用Project
  • 取消这个类(某种“未设置项目”,是否可以使用PHP?)
  • 包括()第二课
  • 使用第二课

我不知道PHP是否有可能(没有找到关于此的任何资源),我不知道更好的方法来管理这个......

3 个答案:

答案 0 :(得分:6)

我最近遇到了这个问题,(令人尴尬的)Joomla。我需要通过加载两个“version.php”文件然后读取类属性来找到两个不同安装的版本和一个脚本。但是,当然,它们都被称为“JVersion”,因此它不可能要求()两个 version.php文件。

经过深思熟虑,我意识到eval()可以取代require()。所以我只是阅读了version.php文件的内容并更改了类的名称,然后是eval()那个文本,然后我可以访问具有不同名称的两个类。我打赌你想要一些代码。这就是我最终的结果......



    $v15_txt=file_get_contents($old_dir.'/libraries/joomla/version.php');
    $v15_txt=preg_replace('/class JVersion/i', 'class JVersion15', $v15_txt);
    eval('?>'.$v15_txt);
    $jvold=new JVersion15;
    $old_version = $jvold->RELEASE.'.'.$jvold->DEV_LEVEL;

    $v25_txt=file_get_contents($new_dir.'/libraries/cms/version/version.php');
    $v25_txt=preg_replace('/class JVersion/i', 'class JVersion25', $v25_txt);
    eval('?>'.$v25_txt);
    $jvnew=new JVersion25;
    $new_version = $jvnew->RELEASE.'.'.$jvnew->DEV_LEVEL;


只需修改它就可以根据需要加载正确的两个文件,并根据需要重命名。对不起,你不得不等了一年多。 : - )

很难相信PHP没有内置的某种“undeclare($ classname)”功能。我甚至无法使用命名空间来解决这个问题,因为这需要更改原始的两个文件。有时你只需要在框架之外思考。

答案 1 :(得分:4)

停止。

无论你做什么都是错的。备份。重新评估你在做什么以及为什么。

如果在那之后,你仍然需要这样做。选择一个应用,然后在应用中查找并替换该类名。如果设计得很好,它应该是独一无二且容易做到的。

记录您在使用的任何外部文档中执行此操作的事实。

答案 2 :(得分:0)

在PHP 5.3和PHP 7中,可以为脚本使用的类添加别名。如果app1\Projectapp2\Project是类的标准名称,则使用它们的代码可以使用以下use语句。

use app1\Project;
use app2\Project as AppProject;

在引用从第二行代码导入的类时,其余代码将使用AppProject

参考