我正在使用一个有很多课程的作曲家库。这里有一个类( Alibrary \ FileA ),它不能完全按照我的意愿去做。
namespace Alibrary;
class FileA
{
public function sayHello()
{
echo 'hello';
}
}
所以我写了一个名为 Mylibrary \ FileB 的替代品。你可以看到它必须更好。
namespace MyLibrary;
use \Alibrary\FileA;
class FileB extends FileA
{
public function sayHello()
{
echo 'hi';
}
}
每次要求 FileA 时,有没有办法告诉Composer加载 FileB ?我只是想替换一个类,主要用于测试目的。我不想创建一个全新的回购 - 我已经看过https://getcomposer.org/doc/04-schema.md#replace了。
我能做到这样吗?
"classmap": [
"\Alibrary\FileA": "MyLibrary\FileB"
],
感谢。
答案 0 :(得分:1)
你的问题与Composer没有多大关系,但与PHP的工作方式有关 - 以及你正在使用的代码。
自动加载获取PHP仍然未知的类的名称,并且必须找到定义此类的代码。但是如果所有类都在一个文件中,那么您所面临的情况将是相同的:代码使用类\Alibrary\FileA
,而不是使用类\MyLibrary\FileB
。请注意,您发明的类名确实建议您考虑文件,这不是主要影响。是的,课程'代码通常存储在文件中,但只要代码由PHP加载,它就只有"类"这是相关的,而不是代码的来源。
所以你有一些做某事的课程,其中一个是\Alibrary\FileA
。你怎么能把它变成你自己的班级?这取决于。如果代码自己创建了FileA类,则无法从外部覆盖它。如果代码要求您将FileA实例作为参数传递,则可以改为传递从FileA继承的FileB类,并且必须使用相同的参数签名实现所有方法,并且必须返回相同的类型。如果它返回完全不同的东西,它可能会起作用,但很可能会破坏。
请注意,如果更新原始库,继承另一个类本身可能会中断。