КаталогBuilderPHPDocs

Глава 14. Пространства имён в PHP

Пространства имён появились в PHP для решения простой, но важной проблемы: в большом проекте слишком легко получить конфликт имён классов, функций и констант. Если два модуля создают класс User, PHP не сможет понять, какой именно класс нужно использовать. Пространства имён позволяют разложить код по логическим областям и сделать имена уникальными.

Современное примечание. В старых проектах классы часто назывались длинно: ShopUserModel, ForumUserModel, AdminUserModel. Сегодня чаще используют короткие имена классов и размещают их в пространствах имён: AppShopUser, AppForumUser.

Объявление namespace

Пространство имён объявляется в начале PHP-файла. До него не должно быть вывода HTML или пробелов вне PHP-кода.

<?php

namespace AppModels;

class User
{
    public function getName()
    {
        return 'Алексей';
    }
}

Подключение класса через use

Чтобы не писать полное имя класса каждый раз, используется оператор use. Он говорит PHP, какой класс мы хотим использовать в текущем файле.

<?php

use AppModelsUser;

$user = new User();

Полное имя класса

Класс можно создать и через полное имя. Обратный слеш в начале означает, что путь начинается от глобального пространства имён.

$user = new AppModelsUser();

Псевдонимы

Если в одном файле нужны два класса с одинаковым коротким именем, можно задать псевдоним.

use AppAdminUser as AdminUser;
use AppSiteUser as SiteUser;

$admin = new AdminUser();
$siteUser = new SiteUser();

Связь с PSR-4

В современных проектах namespace обычно связан с автозагрузкой PSR-4. Например, namespace App может соответствовать каталогу src/. Тогда класс AppServiceMailer будет лежать в файле src/Service/Mailer.php.

{
    "autoload": {
        "psr-4": {
            "App\": "src/"
        }
    }
}

Практический пример структуры

src/
  Controller/
    UserController.php
  Model/
    User.php
  Service/
    AuthService.php

В такой структуре сразу видно назначение файла. Контроллер принимает запрос, модель описывает данные, сервис содержит бизнес-логику.

Типичные ошибки

  • Объявлять namespace не в начале файла.
  • Смешивать несколько несвязанных классов в одном файле.
  • Использовать namespace, но не настроить автозагрузку.
  • Давать пространствам имён слишком длинные и бессмысленные названия.

Итоги

Пространства имён помогают организовать проект и избежать конфликтов. Их стоит использовать вместе с Composer и PSR-4. Даже если проект небольшой, правильная структура классов делает код понятнее и упрощает дальнейшее развитие.