Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

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

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

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

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

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

Зарегистрироваться

или войти в аккаунт

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

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».

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

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

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

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».