【问题标题】:Using two class with the same name使用两个具有相同名称的类
【发布时间】:2011-06-01 02:37:36
【问题描述】:

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

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

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

有解决办法吗?

可能是:

  • 使用项目类
  • undef 这个类(一种“未设置项目”,PHP 可以吗?)
  • include() 第二类
  • 使用第二类

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

【问题讨论】:

  • 也许你可以使用网络服务...但最简单的方法是重命名类...

标签: php class namespaces conflict


【解决方案1】:

我最近遇到了这个问题,(尴尬地)Joomla。我需要用一个脚本找到两个不同安装的版本,方法是加载它们的两个“version.php”文件,然后读取类属性。但是,当然,它们都被称为“JVersion”,因此不可能 require() both 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)”函数。我什至无法用命名空间来解决这个问题,因为这需要更改原始的两个文件。有时你只需要在框架之外思考。

【讨论】:

    【解决方案2】:

    停止。

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

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

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

    【讨论】:

    • “我无法更改班级名称。”
    • 我读了这个问题。但是谢谢你,我应该提到我告诉他做他认为他不能做的事情。
    • 在两个巨大的应用程序中更改类名......它代表了很多工作。它可能会引入错误。而我自己也无法做出选择。如果能避免就更好了。
    • 你不能。如果名称足够独特,则不应产生错误。整个过程可能需要 5 分钟。
    • 如果您能找到名称中包含 Project 的所有其他类。首先更改那些唯一的名称。然后只需更改项目。然后,如果您愿意,可以将其他人改回来。详细的名字是快乐的!
    猜你喜欢
    • 2017-03-04
    • 2011-05-14
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多