有一个包含这些类的库:
其中
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 )
答案 0 :(得分:1)
问题的根源是该库的代码是糟糕的。它与DefaultObject
类名称紧密耦合(因为它在构造函数中启动它,而不是期望它作为依赖项)。
绕过它的唯一方法是实际搞乱自动加载器(假设这个神奇的库没有在同一个文件中定义多个类),如果它甚至使用它。
但无论如何,我建议开始研究如何从项目中删除对该库的依赖。这构成了巨大的发展风险。
答案 1 :(得分:0)
只是为了补充其他正确的答案/评论。
我在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)
{
}
}