Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在不修改文件的情况下向类添加命名空间_Php_Class_Namespaces - Fatal编程技术网

Php 在不修改文件的情况下向类添加命名空间

Php 在不修改文件的情况下向类添加命名空间,php,class,namespaces,Php,Class,Namespaces,我有一个第三方类,我需要修改它的方法之一。 我不想对第三方做任何更改,所以我已经扩展了它 class NewClass扩展了第三方类{} classnameThirdPartyClass在我的代码中以及其他一些第三方类中使用,因此我希望保留该类名 解决这个问题的一个方法是向类添加名称空间 namespace thirdparty; class ThirdPartyClass {} 然后扩展它 class ThirdPartyClass extends \thirdparty\ThirdPar

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

class NewClass扩展了第三方类{}

classname
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\u一次不同

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

这个问题与此无关,答案毫无帮助。

我找到了一个解决方案,但它没有实现一次
require\u

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

class ThirdPartyClass extends \thirdparty\ThirdPartyClass {


}

清洁,但没有解决方案

由于框架的内部用法是通过其名称空间和类名来标识的,如果不更改源类代码,就无法修改类方法

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

肮脏的黑客

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

通常,自动加载程序获取作为参数传递的名称空间和类名,以包含文件系统中匹配的类文件。因此,如果自动加载程序加载了这个特殊类(包括类文件),那么您只需包含修改后的文件即可


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

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