通过composer重写类


Overwriting class via composer

我使用的是一个composer库,里面有很多类。其中有一个类(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';
    }
}

有没有什么方法可以告诉Composer每次请求FileA时都加载FileB?我只想替换一个类,基本上是为了测试目的。我不想创建一个全新的回购——我已经看过https://getcomposer.org/doc/04-schema.md#replace已经

我能做这样的事吗?

"classmap": [
    "'Alibrary'FileA": "MyLibrary'FileB"
],

谢谢。

您的问题与Composer无关,而是与PHP的总体工作方式以及您正在使用的代码有关。

Autoloading获取PHP仍然未知的类的名称,并且必须找到定义该类的代码。但是,如果所有类都在一个文件中,则您所面临的情况是相同的:代码使用的是类'Alibrary'FileA,而不是类'MyLibrary'FileB。请注意,你发明的类名确实表明你在文件中思考,这不是主要影响。是的,类的代码通常存储在文件中,但一旦PHP加载了代码,相关的只是"类",而不是代码的来源。

所以你有一些类可以做一些事情,其中一个是'Alibrary'FileA。你怎么能把它改成你自己的课?这取决于情况。如果代码本身创建了FileA类,则不能从外部重写它。如果代码希望将FileA的实例作为参数传递,则可以传递从FileA继承的FileB类,该类必须使用相同的参数签名实现所有这些方法,并且必须返回相同的类型。如果它返回完全不同的东西,它可能会工作,但很可能会崩溃。

请注意,如果更新原始库,继承另一个类本身可能会中断。