首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建库以使用其类的自定义实现

创建库以使用其类的自定义实现
EN

Stack Overflow用户
提问于 2018-04-11 14:49:24
回答 2查看 49关注 0票数 1

有一个包含以下类的库:

  • 外部图书馆/DefaultObject
  • 外部库/对象使用者
  • 外部库/ObjectEater
  • ExternalLibrary/ObjectCuddler
  • ExternalLibrary/ObjectF**ker

哪里

代码语言:javascript
复制
namespace ExternalLibrary;

class DefaultObject {}

class ObjectConsumer {

    protected $object;

    // the oter Object<...> classes have all the same constructor
    public function __construct()
    {
        $this->object = new DefaultObject;
    }

    public function compareWith(DefaultObject $comparand)
    {
        // just a method in order to have another dependency in the type-hinting
    }
}

我的库希望扩展外部库的概念和功能:

  • MyLibrary/DefaultObject

哪里

代码语言:javascript
复制
namespace ExternalLibrary;

use ExternalLibrary\DefaultObject as BaseDefaultObject;

class DefaultObject extends BaseDefaultObject {
    // marvelous additional concepts on top of the base concepts
}

考虑到我不想包装/扩展/覆盖/重新定义所有可能使用DefaultObject的类

  • 在PHP中,当我依赖外部库时,我有哪些选项可以让我的自定义对象在我的库中的任何地方使用?

(例如ObjectEater依赖MyLibrary/DefaultObject)

  • 其他语言呢?那会更容易吗?
  • 在这种情况下,我是外部库的所有者,可以更改它的代码吗?
EN

回答 2

Stack Overflow用户

发布于 2018-04-11 14:56:45

问题的根源在于那个库的代码是狗屎。它与DefaultObject类名紧密耦合(因为它在构造函数中启动它,而不是将其视为依赖项)。

绕过它的唯一方法是实际地处理自动加载程序(假设这个神奇的库没有在同一个文件中定义多个类),如果它甚至正在使用它。

但无论如何,我建议您开始研究从项目中删除对该库的依赖的方法。它构成了巨大的开发风险。

票数 1
EN

Stack Overflow用户

发布于 2018-04-11 16:31:58

只是为了补充其他正确的答案/评论。

在PHP中,当我依赖外部库时,我有哪些选项可以让我的自定义对象在我的库中的任何地方使用?

你没有像样的选择--任何你可能做的事情都是如此的烦琐,以至于你根本不应该考虑一下。

其他语言呢?那会更容易吗?

我不是很多语言的专家,但我想不出在其他语言中这会更容易。使用者类在其构造函数中实例化特定的类,通过这样做,它们故意让您别无选择地重写该行为。他们想要使用那个类的实例,仅此而已.

在这种情况下,我是外部库的所有者,可以更改它的代码吗?

您可以使用众所周知的Dependency Injection方法,为使用接口而不是实现提供额外的积分,并使构造函数参数具有可选性,以便与使用这些类的任何其他代码保持向后兼容性-类似这样的情况:

代码语言:javascript
复制
class ObjectConsumer {

    protected $object;

    public function __construct(DefaultObjectInterface $object = null)
    {
        $this->object = $object !== null ? $object : new DefaultObject();
    }

    public function compareWith(DefaultObjectInterface $comparand)
    {
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49778228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档