Зарегистрируйтесь, чтобы продолжить обучение

Вложенные пространства имен Основы PHP

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

Файловая структура практически любого проекта на 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/

Дополнительные материалы

  1. Эталонный пакет на PHP

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 2 января

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»