В этом уроке мы продолжим изучать пространства имен и подробнее поговорим о вложенности в них.
Файловая структура практически любого проекта на PHP выглядит так:
src/ # исходные файлы
tests/
composer.json
composer.lock
.git
README.md
Директория src предназначена для хранения исходного кода программы или сайта.
Ее структура НЕ плоская — внутри src могут находиться другие директории с PHP-файлами внутри них:
my-site/
src/
Formatters/
Pretty.php
Generator.php
Разберемся, как отображать структуру пространств имен на файловую структуру.
В прошлом уроке мы говорили, что в PHP пространства имен появились не с самого начала, что оставило свой отпечаток. В Python, Java и других языках структура пакетов тесно связана с файловой структурой. Поэтому такой проблемы в этих языках нет. В PHP это правило задано на уровне соглашений.
Если взять файл Pretty.php, то его пространство имен следовало бы назвать FormattersPretty
, что отражает вложенность Formatters/Pretty
.
Но можно сделать еще лучше — использовать вложенные пространства имен:
<?php
namespace Formatters\Pretty;
function render($data)
{
// some code
}
Возможность вкладывать пространства имён друг в друга позволяет думать о пространствах имен как о файловой структуре, где пространства имен — это директории, а функции — это файлы.
Кроме вложенности, такие пространства имен ничем не отличаются от обычных пространств имен:
<?php
namespace Generator;
function generate($data)
{
return \Formatters\Pretty\render($data);
}
Описанная выше схема именования пространств помогает избавиться от большого числа проблем, связанных с коллизиями. Но все же этого недостаточно.
Дело в том, что теперь сами пространства становятся уникальными и не должны пересекаться. Но при этом пространство с именем Generator
может периодически встречаться в разных библиотеках — потому что это слишком общее слово.
Поэтому каждый проект или пакет принято помещать в одно общее пространство и не загрязнять глобальное пространство множеством пространств имен. Это название выбирается на основе названия самого проекта — той директории, внутри которой лежит src.
В нашей структуре директорий мы выбрали my-site. Это значит, что общим пространством для всех файлов внутри src будет My\Site
. Если имя директории содержит дефис, то он заменяется на обратный слэш \
, а каждое слово начинается с заглавной буквы:
<?php
// src/Formatters/Pretty.php
namespace My\Site\Formatters\Pretty;
// some code
<?php
// src/Generator.php
namespace My\Site\Generator;
// some code
Самостоятельная работа
- Изучите структуру пространств имен в пакете https://github.com/hexlet-components/php-pairs/
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты