@karpo518

Как правильно использовать namespace и use в PHP?

Я создаю плагин для СMS. Изначально я использовал префикс в именах классов для уникализации и не использовал автозагрузку классов. Сейчас кодовая база значительно увеличилась, и я решил заменить префиксы на пространства имён, а также внедрить автозагрузку классов. У меня сразу возникло несколько вопросов. Ранее я использовал фреймворки, но в нём правила именования и автозагрузки задавались самим фреймворком.

Для уникализации имени класса мне достаточно одного короткого слова. Таким образом, для файлов во всех папках я хотел бы использовать один короткий namespace. А в use прописывать путь до папок с нужными классами. Короткий namespace упростит создание новых классов, а пути к папкам в use позволят мне не прописывать полный путь до каждого используемого класса. Но вся моя теория разбивается о реальные примеры.
use folder1\subfolder1;

spl_autoload_register(function ($class) {
	var_dump($class);
});

$class = new Test_class();


В функцию автозагрузки не попадает путь из use, пока я не заменю use на folder1\subfolder1\Test_class. Но такой вариант меня совсем не устраивает. Я не получу профита в удобстве использования, если заменю 10 вызовов require в моем файле на 10 вызовов use.
Я добавил namespace в главный файл плагина, не являющийся классом и запутался окончательно. Если использовать use folder1\subfolder1, то взагрузчике получаю my_namespace\Test_class. Если же прописать use folder1\subfolder1\Test_class, то namespace исчезает из переданного имени класса, но появляется путь из use. Почему в одних случаях namespace игнорируется, а в других - нет?

В итоге мне непонятно, связан ли как-то namespace и use, и почему путь из use не попадает в функцию автозагрузки.
Подскажите, как настроить всё правильно.
  • Вопрос задан
  • 302 просмотра
Пригласить эксперта
Ответы на вопрос 1
@karpo518 Автор вопроса
В PHP нельзя импортировать сразу несколько классов из-за особенности работы языка. Если Java может легко узнать какие классы находятся в пакете (namespace), то PHP так не может, там все динамически и заранее какие классы находятся в namespace'e узнать невозможно. Да и namespace в PHP это как макросы, все названия классов раскрываются на этапе трансляции в байткод, а не во время выполнения.

https://habr.com/ru/post/212773/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽