通过作曲家覆盖课程

时间:2015-12-08 17:00:57

标签: php inheritance composer-php

我正在使用一个有很多课程的作曲家库。这里有一个类( 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"
],

感谢。

1 个答案:

答案 0 :(得分:1)

你的问题与Composer没有多大关系,但与PHP的工作方式有关 - 以及你正在使用的代码。

自动加载获取PHP仍然未知的类的名称,并且必须找到定义此类的代码。但是如果所有类都在一个文件中,那么您所面临的情况将是相同的:代码使用类\Alibrary\FileA,而不是使用类\MyLibrary\FileB。请注意,您发明的类名确实建议您考虑文件,这不是主要影响。是的,课程'代码通常存储在文件中,但只要代码由PHP加载,它就只有"类"这是相关的,而不是代码的来源。

所以你有一些做某事的课程,其中一个是\Alibrary\FileA。你怎么能把它变成你自己的班级?这取决于。如果代码自己创建了FileA类,则无法从外部覆盖它。如果代码要求您将FileA实例作为参数传递,则可以改为传递从FileA继承的FileB类,并且必须使用相同的参数签名实现所有方法,并且必须返回相同的类型。如果它返回完全不同的东西,它可能会起作用,但很可能会破坏。

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