В этой статье я опишу два способа указать неймспейсы в вашем проекте на PHP, чтобы PhpStorm их “увидел”.
Если вы уже знаете что такое неймспейс и автолоадер, пропустите начало и пролистайте вниз, к способам.
Что такое неймспейс
Неймспейс — это группировка классов объединённых общим назначением.
“Namespace” переводится как “пространство имён”, но этот термин не прижился, поэтому далее пишу “неймспейс”.
По соглашениям принятым в PHP, неймспейсы соответствуют структуре папок в проекте: PSR-4.
Пример неймспейса
В классе PHP неймспейс будет выглядеть так:
<?php
namespace App\Money\Models;
class MoneyTransfer { ... }
При этом сам файл MoneyTransfer.php
будет находиться в папке /src/Money/Models
.
Все папки начиная от /src
будут транслированы в неймспейс, потому что таков стандарт. Если мы видим в неймспейсе Money
то это означает папку Money
. И далее все папки по вложенности. Очень удобно.
Неймспейсы сообщают автолоадеру, в каких папках искать файлы классов.
Автолоадер
Автолоадер — это служебный код, с помощью которого интерпретатор в момент выполнения кода вашего приложения находит в файловой системе все классы которые упоминаются в выполняемом коде.
Автолоадеру известен неймспейс и имя класса, он ищет файл на диске чтобы загрузить этот класс.
В интерпретаторе PHP есть встроенный автолоадер, он не очень полезен, так как алгоритм поиска туповат. Но встроенный автолоадер можно переопределить, поэтому раньше фреймворки так и делали, в фреймворки встраивались свои автолоадеры.
Стоило создать приложение на фреймворке, и ваши классы моделей начинали подгружаться из папки /models
, контроллеры из /controllers
и так далее.
В современных фреймворках уже отошли от этого и используют встроенный в Composer автолоадер. Он использует стандарт PSR-4 и поэтому его легко освоить.
Корневой неймспейс
Но как автолоадер, который ищет классы по неймспейсам, узнает что папка src
это корневой неймспейс App
?
Ведь имя корневого неймспейса и папки различаются и вообще могут быть произвольными, например папка classes
и неймспейс CoolLibrary
. Тут не угадаешь.
Информация о том к какой папке привязан корневой неймспейс нужна не только автолоадеру в момент выполнения кода, но и нашему IDE, в частности PhpStorm.
Рассмотрим два способа добавить эту информацию о корневом неймспейсе.
Способ 1. Неймспейс в composer.json
Указываем, что папка src
это корневой неймспейс App
.
В файл composer.json
добавляем следующие строки:
{
...
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
...
}
Как результат, этот неймспейс должен подхватиться и стандартным композеровским автолоадером, и PhpStorm.
Способ 2. Неймспейс в настройках PhpStorm
Шаг 1. Помечаем папку src
как папку с исходным кодом
Правой кнопкой мыши нажимаем на папку src
, в меню выбираем “Mark Directory as” -> “Sources Root”.
Шаг 2. Привязываем неймспейс в настройках
Теперь PhpStorm будет знать, какой неймспейс привязан к папке.
Этот способ особенно полезен для проектов созданных на старых версиях фреймворков.
Результат
Мы можем проверить, что неймспейс привязан правильно.
Создадим новую папку, /src/ElonMusk
.
Теперь создадим класс Tesla
:
Мы видим, что PhpStorm указал для создаваемого класса правильный неймспейс App\ElonMusk
.
<?php
namespace App\ElonMusk;
class Tesla
{
}
Всё работает 🎉