2016-07-29 3 views
2

Кажется, я сталкиваюсь с несколькими вариантами определения пространства имен laravel (в классах), и мне интересно, если некоторые из них лучше других или, может быть, даже ошибочны.Как суетливые пространства имен Laravel?

  1. namespace mydomain\app\controllers
  2. namespace dev.mydomain.com\app\controllers
  3. namespace app\controllers
  4. namespace \app\controllers

Пара вопросов:

  • Я знаю, что начальная \ является Optio nal, но какой префикс mydomain? Требуется ли это или необязательно?
  • Имеет значение использовать dev.mydomain.com есть или только mydomain?
  • Это просто вопрос того же, что и имена папок?
+1

Исходная косая черта относится к [глобальному пространству имен] (http://www.php.net/manual/en/language.namespaces.global.php). Не имеет значения, используете ли вы 'dev' или нет перед пространством имен. Это просто пространство имен. Имена папок не относятся к пространству имен как таковому, но некоторые загрузчики используют пространство имен как сопоставление для папок. Посмотрите [здесь] (https://daylerees.com/php-namespaces-explained/) для более подробного объяснения. – Andrew

+0

Есть ли разница между 'myproject \ app \ контроллерами' и' \ app \ контроллерами' и 'app \ controllers'? – Maxcot

+0

Да. Там есть. Согласно стандарту загрузки [psr-4] (http://www.php-fig.org/psr/psr-4/), который использует laravel, пространство имен должно быть '\ (\ ) * \ 'где' SubNamespaceNames' может быть сколько угодно. – Andrew

ответ

1

Нет ничего лучше или хуже в тех пространствах имен, о которых вы упоминаете.

Пространства имен были добавлены на язык, чтобы предотвратить столкновения имен в отдельных пакетах.

Например, вы можете иметь класс User в своем собственном пространстве имен \MyApp\User, а также использовать пакет третьей стороны, класс с именем User, но в своем собственном пространстве имен \Package\User.

Это была начальная идея. Позже люди решили, что мы можем использовать эти пространства имен для автоматической загрузки некоторых классов. Исходная идея заключается в том, что \MyApp\User находится в MyApp/User.php. Довольно просто.

Это продвинутое, конечно, что вы можете узнать больше, выполнив поиск «автозагрузку php» или «автозагрузку композитора».

И об этом начальном \, в некоторых местах это не имеет значения, но это имеет значение в другом месте. При объявлении пространства имен это не имеет значения, например. namespace \MyApp\User - то же, что и namespace MyApp\User. Также оператор use ведет себя следующим образом. Но когда вы собираетесь использовать класс, то есть new \MyApp\User() против new MyApp\User, он отличается. Вы можете найти дополнительную информацию в PHP documentation.

Хорошо, достаточно фона. Ваши вопросы конкретно.

Я знаю, что начальный \ не является обязательным, но какой префикс mydomain? Требуется ли это или необязательно?

Что касается случая с Laravel, то он не является обязательным. Посмотрите на composer.json, под psr-4 вы обнаружите, что папка app имеет определенный префикс для пространства имен. Это то, что вы должны использовать для своих классов (если они находятся в папке app). Чтобы узнать больше, найдите PSR-4.

Имеет ли значение использование dev.mydomain.com или это только мой домен?

Я думаю, что я уже упоминал PSR-4, поэтому используйте все, что есть.

Это просто вопрос того же, что и имена папок?

Это также PSR-4. Узнайте больше об этом, и на все ваши вопросы ответят.

Но, короче говоря, у нас есть два стандарта для автозагрузки классов на основе пространств имен в PHP: PSR-0 и PSR-4.

В PSR-0 (старый), структура каталогов должна была соответствовать пространству имен точно, то есть, если ваш корневой папке были src и вы класс был назван \Package\User, то вы были src/Package/User.php в файловой системе.

В PSR-4 у нас может быть префикс пространства имен для каталога. Например, вы говорите, что все, что находится в папке src, начинается только с пространства имен \App\Package. Класс a \App\Package\User должен находиться в src/User.php, с правильным пространством имен, конечно. Это то, что используется Laravel и большинство пакетов в эти дни.

+0

Спасибо, это очень информативно. – Maxcot

Смежные вопросы