Intereting Posts
Проверка в форме регистрации пользователя? Отправка входных данных с android на php php – настройка для часовых поясов Как получить звание определенного пользователя в конкретном предмете для всех испытуемых, признанных связями laravel 4 -> получить имена столбцов Зарегистрировать IP-адрес пользователя, дату и время Как определить тему wordpress с помощью php JavaScript не запускается после добавления Рекурсивное обход дерева с помощью mysql через PHP Лучший способ реализовать шаблон декоратора для кэширования результатов метода в PHP Получите ВСЕ возможные результаты из смесительного массива php mutilthreading, доступ к переменным массива Что эквивалентно оператору сброса ветвей («? |»), Найденному в php (pcre) в C #? Что это значит? "Ошибка анализа: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM" Аутентификация (претензии) к Sharepoint / Office356 через PHP и SOAP

Автозагрузка моих классов с подпространствами имен (Composer.json)

Я добавил следующее в файл composer.json . Это работает отлично, но у меня есть длинный список подпространств имен (например, Apple, Orange, Lemon, Pear, Banana … и т. Д.), Которые я хочу включить.

1) Должен ли я указывать каждое пространство под-имен или есть ярлык, например. "Pure\\*": "pure"

composer.json:

 "autoload": { "psr-4": { "Pure\\": "pure", "Pure\\Apple\\": "pure/src/Pure/Apple", "Pure\\Orange\\": "pure/src/Pure/Orange", "Pure\\Lemon\\": "pure/src/Pure/Lemon" } } 

2) Лучше ли включать в него файл автоматической загрузки:

composer.json:

 "autoload": { "files": [ "pure/src/Pure/autoload.php" ] } 

autoload.php:

 spl_autoload_register(function ($class) { //etc... } 

Должен ли я указывать каждое пространство под-имен или есть ярлык

При объявлении автозагрузки вы должны использовать максимально возможный или разумный префикс.

Если этот примерный пакет является единственным, который вы когда-либо создавали, и он является единственным, использующим Pure как пространство имен, пойдите с этим, если число более длинных префиксов в нескольких подкаталогах слишком велико. Однако это предполагает, что любой другой пакет в мире, который вы используете, должен избегать делать то же самое с тем же пространством имен.

Композитор сможет искать подпространства имен во всех доступных каталогах, т. Е. Если у вас есть два пакета, и один говорит, что Pure можно найти в pure/src/Pure , а другой говорит, что Pure – это code/stuff , Composer попытается сначала найти класс Pure\Something\Class в одном из этих каталогов, а затем попробовать второй, если он его не найдет. Composer запомнит, существует ли каталог pure/src/Pure/Something и не ищет ничего, начиная с Pure\Something там, если требуется загрузить второй класс в этом пространстве имен.

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

Лучше ли включать в него файл автоматической загрузки:

Нет, избегайте этого любой ценой. Вы не получите никакой пользы от этого, потому что файл всегда должен быть загружен, и это дубликат кода, который занимает некоторую память – у вас уже есть автозагрузчик из Composer. Если у вас есть код, который не соответствует PSR-4 или PSR-0, вы можете использовать classmap. Для нового кода: используйте только PSR-4!

Кроме того, ваш пользовательский автозагрузчик не может быть оптимизирован Composer. Хотя любая оптимизация должна быть измерена для эффективности (прочитайте мой подробный ответ на этот вопрос: зачем использовать автозагрузку PSR-0 или PSR-4 в компоновщике, если классная карта на самом деле быстрее? ), Использование вашего собственного автозагрузчика полностью предотвратит оптимизацию вашего кода, если это было бы полезно.