Создайте библиотеку для использования собственной реализации своего класса

Есть библиотека с этими классами:

  • ExternalLibrary / DefaultObject
  • ExternalLibrary / ObjectConsumer
  • ExternalLibrary / ObjectEater
  • ExternalLibrary / ObjectCuddler
  • ExternalLibrary / ObjectF ** кег

куда

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

куда

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)

  • А как насчет других языков? Это будет проще?
  • А что в таком случае я был владельцем внешней библиотеки и мог изменить ее код?

1

Решение

Источником проблемы является то, что код этой библиотеки дерьмо. Он тесно связан с DefaultObject имя класса (потому что оно инициирует его в конструкторе, а не ожидает его как зависимость).

Единственный способ обойти это — фактически связываться с автозагрузчиком (при условии, что эта магическая библиотека не определяет несколько классов в одном файле), если она даже использует его.

Но в любом случае, я бы порекомендовал начать искать способы удаления зависимости от этой библиотеки из вашего проекта. Это огромный риск для развития.

1

Другие решения

Просто чтобы дополнить другие правильные ответы / комментарии.

Какие опции у меня есть в PHP, чтобы мой пользовательский объект мог использоваться везде в моей библиотеке, когда я полагаюсь на внешнюю библиотеку?

У вас нет приличных вариантов — все, что вы можете сделать, настолько хакерское, что вам даже на секунду не стоит об этом думать.

А как насчет других языков? Это будет проще?

Я не эксперт по многим языкам, но я не могу думать, как это может быть проще на других языках. Потребительские классы создают конкретный класс в своих конструкторах, и, делая это, они намеренно не оставляют вам выбора переопределять это поведение. Они хотят использовать экземпляр этого класса, и это все …

А что в таком случае я был владельцем внешней библиотеки и мог изменить ее код?

Вы бы использовали известный Внедрение зависимости подход, с бонусными баллами за использование интерфейсов вместо реализаций, а также за счет необязательности аргумента конструктора, чтобы сохранить обратную совместимость с любым другим кодом, использующим эти классы — что-то вроде:

class ObjectConsumer {

protected $object;

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

public function compareWith(DefaultObjectInterface $comparand)
{
}
}
0

По вопросам рекламы [email protected]