Как устранить неоднозначность классов при импорте библиотек в карту классов? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть старая библиотека, которая мне нужна в моем проекте, которая не использует PSR-0/4 или какое-либо пространство имен вообще.Он имеет множество файлов PHP с различными классами.Допустим, я добавляю эту библиотеку в свой проект с помощью автозагрузки 'classmap' (как предполагает документация Composer):

"autoload": {
    "classmap": [
        "libraries/some-lib"
    ]
}

Проблема в том, что эта библиотека не использует наследование / полиморфизм - у нее есть базовые классы с такими жеимена и те же методы (но разные реализации этих методов) в разных файлах PHP.

библиотеки / some-lib / Foo.php:

class Foo
{
    public function bar()
    {
        ...
    }
}

library / some-lib / Foo-alternate.php:

class Foo
{
    public function bar()
    {
        ...
    }
}

Так что, когда composer генерирует свою карту классов, для них генерируется 1016 предупреждений, и только одна версия Foo будетДоступен для меня в коде моего проекта через \Foo из-за конфликтов имен.

Мой вопрос: как решить эту проблему здесь без изменения библиотечного кода ?Есть ли какие-либо опции, которые Composer предоставляет для подобных ситуаций, чтобы я мог импортировать обе версии класса Foo в карту классов композитора и в результате различать их в моем проекте?

1 Ответ

0 голосов
/ 04 октября 2018

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

Хотя вы хотите избежать изменения библиотечного кода, на самом деле это самое простое и надежное решение.Внести эти изменения должно быть легко, и я сомневаюсь, что библиотека, которая до сих пор не использует PSR-0/4, активно развивается, поэтому для обслуживания fork не требуется никаких дополнительных усилий.


Есть ли какие-либо параметры, которые Composer предоставляет для подобных ситуаций, чтобы я мог импортировать обе версии класса Foo в карту классов композитора и в результате различать их в моем проекте?

Полностью определенное имя (которое для не-namespaced classes - это просто имя класса) должно быть уникальным, это ограничение PHP, и автозагрузчик Composer полагается на него.Лучшее, что вы можете получить, - это игнорировать один из этих классов, используя параметр exclude-from-classmap:

"autoload": {
    "exclude-from-classmap": ["libraries/some-lib/Foo-alternate.php"]
}

Тогда Composer будет автоматически загружать только класс из libraries/some-lib/Foo.php.Вы все еще можете загрузить второй класс вручную (require __DIR__ . '/libraries/some-lib/Foo-alternate.php'), но с этим следует быть очень осторожным (это приведет к фатальной ошибке, если libraries/some-lib/Foo.php уже загружен).

...