【问题标题】:add namespace to class without modifying file将命名空间添加到类而不修改文件
【发布时间】:2016-06-25 12:26:31
【问题描述】:

我有一个第 3 方类,我需要修改它的一种方法。 我不想对第 3 方进行任何更改,所以我已经扩展了它。

class NewClass extends ThirdPartyClass {}

类名 ThirdPartyClass 在我的代码和其他一些第 3 方类中使用,所以我想保留该类名。

解决方案是为类添加命名空间。

namespace thirdparty;

class ThirdPartyClass {}

然后扩展它

class ThirdPartyClass extends \thirdparty\ThirdPartyClass

但就像我说的,我不想对第三方类进行任何修改。

该类是这样包含的。

require_once('thirdparty/3rdpartyclass.php');

我已经尝试了以下

namespace thirdparty;
require_once('thirdparty/3rdpartyclass.php');

namespace thirdparty;
include_once('thirdparty/3rdpartyclass.php');

关于如何为我的新班级使用相同的班级名称有什么建议吗?

编辑

这可行,但与使用require_once不同

eval('namespace thirdparty;?>' . file_get_contents('thirdparty/3rdpartyclass.php'));

此问题与PHP namespace removal / mapping and rewriting identifiers 无关,答案毫无帮助。

【问题讨论】:

  • 您希望使用 ThirdPartyClass 类的第 3 方使用您的修改版本还是继续使用“原始”类?
  • @mrun,它只是我的代码需要使用修改后的版本,但如果第三方更容易使用修改后的类,那很好。
  • @TarranJones 我可能在这里遗漏了一些东西(如果是这种情况,请原谅我!)但是是什么阻止了你以任何你想要的方式命名你的类,只修改 你的使用该名称的代码?
  • @mron 抱歉,我之前错了。我无法编辑的代码需要使用ThirdPartyClass 的修改版本。我将框架本身作为“我的代码”包含在内,并且我希望对核心进行最小的更改。

标签: php class namespaces


【解决方案1】:

干净,但没有解决办法

因为框架内部使用是由它的命名空间和类名来标识的,你不能在不改变 origins 类代码的情况下修改类方法。

唯一的解决方案——正如@mrun 提到的——是创建一个子类并覆盖您需要修改的方法。之后,您可以在项目代码中使用子类

肮脏的黑客攻击

如果您使用自动加载器并可能影响其行为,您可以在不符合 PSR 的位置创建该类的副本并修改其代码。

通常,自动加载器会获取作为参数传递的命名空间和类名,以包含来自文件系统的匹配类文件。所以如果这个特殊的类应该被自动加载器加载(包含的类文件),你可以简单地包含修改后的文件。

但是:如果框架更新,您必须确保修改后的版本仍然有效。

【讨论】:

    【解决方案2】:

    我找到了解决方案,但它没有实现require_once

    eval('namespace thirdparty;?>' . file_get_contents('thirdparty/3rdpartyclass.php'));
    
    class ThirdPartyClass extends \thirdparty\ThirdPartyClass {
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多