2016-03-15 2 views
1

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

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" 
    ] 
} 

автозагрузку .php:

spl_autoload_register(function ($class) { 

    //etc... 
} 
+2

Ваша первая строка включает все подпространства имен. – JimL

+0

Я получаю «класс» Чистый \ Apple \ Apple «не найден», если я просто включаю первую строку – Bxx

+1

. Затем вам необходимо иметь все файлы относительно чистой папки .. т.е. Pure \ Apple \ Apple должно быть в чистом виде /Apple/Apple.php – JimL

ответ

0

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

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

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

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

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

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

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

Кроме того, ваш пользовательский автозагрузчик не может быть оптимизирован композитором. Хотя любая оптимизация должна быть измерена для эффективности (прочитайте мой подробный ответ на этот вопрос: Why use a PSR-0 or PSR-4 autoload in composer if classmap is actually faster?), использование вашего собственного автозагрузчика полностью предотвратит оптимизацию вашего кода, если это будет выгодно.