Основы PHP
2026-02-26 20:23 Diff

В этом уроке мы продолжим изучать пространства имен и подробнее поговорим о вложенности в них.

Файловая структура практически любого проекта на PHP выглядит так:

Директория src предназначена для хранения исходного кода программы или сайта.

Ее структура НЕ плоская — внутри src могут находиться другие директории с PHP-файлами внутри них:

Разберемся, как отображать структуру пространств имен на файловую структуру.

В прошлом уроке мы говорили, что в PHP пространства имен появились не с самого начала, что оставило свой отпечаток. В Python, Java и других языках структура пакетов тесно связана с файловой структурой. Поэтому такой проблемы в этих языках нет. В PHP это правило задано на уровне соглашений.

Если взять файл Pretty.php, то его пространство имен следовало бы назвать FormattersPretty, что отражает вложенность Formatters/Pretty.

Но можно сделать еще лучше — использовать вложенные пространства имен:

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

Кроме вложенности, такие пространства имен ничем не отличаются от обычных пространств имен:

Описанная выше схема именования пространств помогает избавиться от большого числа проблем, связанных с коллизиями. Но все же этого недостаточно.

Дело в том, что теперь сами пространства становятся уникальными и не должны пересекаться. Но при этом пространство с именем Generator может периодически встречаться в разных библиотеках — потому что это слишком общее слово.

Поэтому каждый проект или пакет принято помещать в одно общее пространство и не загрязнять глобальное пространство множеством пространств имен. Это название выбирается на основе названия самого проекта — той директории, внутри которой лежит src.

В нашей структуре директорий мы выбрали my-site. Это значит, что общим пространством для всех файлов внутри src будет My\Site. Если имя директории содержит дефис, то он заменяется на обратный слэш \, а каждое слово начинается с заглавной буквы: