将命名空间添加到类而不修改文件


add namespace to class without modifying file

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

class NewClass extends ThirdPartyClass {}

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

对此的解决方案是向类添加一个命名空间。

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命名空间删除/映射和重写标识符无关,答案没有任何帮助。

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

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

}

干净,但没有解决方案

由于框架内部用法由其命名空间和类名标识,因此无法在不更改 origins 类代码的情况下修改类方法。

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

肮脏的黑客

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

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

但是:如果框架更新,您必须确保修改后的版本仍在工作。