Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Вложенные пространства имен Основы 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

Самостоятельная работа


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

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

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы PHP-разработчик
Профессия
с нуля
Разработка веб-приложений на Laravel
1 декабря 10 месяцев

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

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

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

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