有一个包含以下类的库:
哪里
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
}
}我的库希望扩展外部库的概念和功能:
哪里
namespace ExternalLibrary;
use ExternalLibrary\DefaultObject as BaseDefaultObject;
class DefaultObject extends BaseDefaultObject {
// marvelous additional concepts on top of the base concepts
}考虑到我不想包装/扩展/覆盖/重新定义所有可能使用DefaultObject的类
(例如ObjectEater依赖MyLibrary/DefaultObject)
发布于 2018-04-11 14:56:45
问题的根源在于那个库的代码是狗屎。它与DefaultObject类名紧密耦合(因为它在构造函数中启动它,而不是将其视为依赖项)。
绕过它的唯一方法是实际地处理自动加载程序(假设这个神奇的库没有在同一个文件中定义多个类),如果它甚至正在使用它。
但无论如何,我建议您开始研究从项目中删除对该库的依赖的方法。它构成了巨大的开发风险。
发布于 2018-04-11 16:31:58
只是为了补充其他正确的答案/评论。
在PHP中,当我依赖外部库时,我有哪些选项可以让我的自定义对象在我的库中的任何地方使用?
你没有像样的选择--任何你可能做的事情都是如此的烦琐,以至于你根本不应该考虑一下。
其他语言呢?那会更容易吗?
我不是很多语言的专家,但我想不出在其他语言中这会更容易。使用者类在其构造函数中实例化特定的类,通过这样做,它们故意让您别无选择地重写该行为。他们想要使用那个类的实例,仅此而已.
在这种情况下,我是外部库的所有者,可以更改它的代码吗?
您可以使用众所周知的Dependency Injection方法,为使用接口而不是实现提供额外的积分,并使构造函数参数具有可选性,以便与使用这些类的任何其他代码保持向后兼容性-类似这样的情况:
class ObjectConsumer {
protected $object;
public function __construct(DefaultObjectInterface $object = null)
{
$this->object = $object !== null ? $object : new DefaultObject();
}
public function compareWith(DefaultObjectInterface $comparand)
{
}
}https://stackoverflow.com/questions/49778228
复制相似问题