Как предотвратить конфликты пространства имен PHP (предварительно упакованные пакеты)

Давайте предположим, что у нас есть проект PHP с зависимостями а также В каждый в зависимости от библиотеки PHP Икс, но в другой версии.

Обычно можно использовать менеджер зависимостей PHP, такой как composer, который разрешит этот конфликт путем включения Икс в версии, совместимой с обоими а также В или отобразить ошибку, если конфликт не может быть разрешен.

Теперь многие PHP-приложения позволяют своим пользователям устанавливать плагины, просто загружая предварительно упакованные пакеты и распаковывая их в определенный каталог плагинов.

Если а также В были такие готовые плагины, и оба принесли свою версию библиотеки Икс, мы можем столкнуться с проблемами, так как нет менеджера зависимостей для выбора совместимого Икс для нас или отобразить ошибку, если ее нет.

Чтобы предотвратить любые такие конфликты, вызванные неспособностью PHP иметь библиотеку Икс будучи загруженным дважды с другой версией в одно и то же пространство имен, мы могли бы поместить «s Икс а также В«s Икс в разные пространства имен (что может быть трудно сделать автоматически, поскольку для этого нам понадобится синтаксический анализатор PHP …).

Мой вопрос:

  • Как бы вы решили эту проблему? Можете ли вы порекомендовать этот подход или есть лучшее решение?

5

Решение

Нет решения без изменения кода. Если в файловой системе существуют две версии ´ \ Vendor \ AnyClass´ и выполняется код для их использования, либо возникает ошибка, поскольку повторное указание этого класса недопустимо, либо ожидаемый класс несовместим. Он будет работать только в том случае, если интерфейс класса реализован одинаково, то есть оба кода совместимы. Проблема совместимости сложна, если речь идет не только об одном классе, но и о целом дереве объектов, которые могут плохо реагировать на смешение классов из разных версий, даже если они предлагают совместимый интерфейс.

Изменение пространства имен — это изменение кода. Кто за это отвечает? Я могу подумать о каком-то автоматическом парсере кода, который мог бы добавить определенный префикс пространства имен для каждого плагина, но эта задача еще не выполнена, насколько мне известно в PHP. Ребята из Java в моей компании сделали несколько замечаний, что такая проблема там решена, но у меня нет подробностей.

Кроме того, это удваивает вашу кодовую базу, и дублированный код должен использовать только один кэш кода операции, который у вас есть.

Я знаю, что основные разработчики WordPress все еще борются с этой проблемой. Есть несколько закодированных предложений о том, как использовать Composer для управления зависимостями (то есть плагины и их зависимости), но я не думаю, что они достигли достаточного прогресса на данный момент.

По сути, у вас есть два варианта: 1. Создать префикс пространства имен кода, проанализировать все файлы, принадлежащие плагину (поэтому автор плагина должен как-то включить его зависимости), изменить код, жить с дублированием кода и посмотреть, что вас ждет когда дело доходит до отладки. Недостатком является то, что ни один код вне этого плагина не сможет легко использовать код плагина напрямую, потому что это будет означать знание созданного префикса. 2. Реализуйте некоторую форму управления зависимостями, предпочтительно используя Composer, и не изменяйте пространства имен.

Обновить: Я снова проконсультировался со своими коллегами по Java, и они в основном сделали то же самое заявление о Java, что и я о PHP: у вас не может быть двух разных версий класса под одним и тем же именем класса, и нет «волшебства» даже для Java, но переименование класса в другое пространство имен.

5

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

Других решений пока нет …