Есть библиотека с этими классами:
куда
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)
Источником проблемы является то, что код этой библиотеки дерьмо. Он тесно связан с DefaultObject
имя класса (потому что оно инициирует его в конструкторе, а не ожидает его как зависимость).
Единственный способ обойти это — фактически связываться с автозагрузчиком (при условии, что эта магическая библиотека не определяет несколько классов в одном файле), если она даже использует его.
Но в любом случае, я бы порекомендовал начать искать способы удаления зависимости от этой библиотеки из вашего проекта. Это огромный риск для развития.
Просто чтобы дополнить другие правильные ответы / комментарии.
Какие опции у меня есть в PHP, чтобы мой пользовательский объект мог использоваться везде в моей библиотеке, когда я полагаюсь на внешнюю библиотеку?
У вас нет приличных вариантов — все, что вы можете сделать, настолько хакерское, что вам даже на секунду не стоит об этом думать.
А как насчет других языков? Это будет проще?
Я не эксперт по многим языкам, но я не могу думать, как это может быть проще на других языках. Потребительские классы создают конкретный класс в своих конструкторах, и, делая это, они намеренно не оставляют вам выбора переопределять это поведение. Они хотят использовать экземпляр этого класса, и это все …
А что в таком случае я был владельцем внешней библиотеки и мог изменить ее код?
Вы бы использовали известный Внедрение зависимости подход, с бонусными баллами за использование интерфейсов вместо реализаций, а также за счет необязательности аргумента конструктора, чтобы сохранить обратную совместимость с любым другим кодом, использующим эти классы — что-то вроде:
class ObjectConsumer {
protected $object;
public function __construct(DefaultObjectInterface $object = null)
{
$this->object = $object !== null ? $object : new DefaultObject();
}
public function compareWith(DefaultObjectInterface $comparand)
{
}
}