Что такое namespace в PHP?

«Что такое namespace в PHP?» — вопрос из категории PHP Core, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пространства имён (namespaces) в PHP — это механизм для инкапсуляции и организации элементов кода (классов, интерфейсов, функций и констант), предназначенный для решения двух основных проблем:

  1. Избежание конфликтов имён между кодом вашего приложения, внутренними классами PHP и сторонними библиотеками.
  2. Создание псевдонимов (алиасов) для длинных имён, что улучшает читаемость кода.

Без namespace класс Logger из вашей библиотеки мог бы конфликтовать с классом Logger из фреймворка. С namespace они становятся MyVendorMyAppLogger и FrameworkLoggingLogger.

Объявление и использование:

// Файл: src/MyVendor/MyApp/Logger.php
namespace MyVendorMyApp; // Объявление пространства имён

class Logger {
    public function log($message) {
        echo "[" . date('Y-m-d H:i:s') . "] $messagen";
    }
}

// Файл: src/MyVendor/MyApp/Utils/Helper.php
namespace MyVendorMyAppUtils; // Вложенное пространство имён

function debug($data) {
    var_dump($data);
}

Использование в другом файле:

// index.php

// 1. Использование полного имени (fully qualified name)
$logger1 = new MyVendorMyAppLogger();
$logger1->log("Starting app...");

// 2. Использование оператора `use` для создания алиаса
use MyVendorMyAppLogger;
$logger2 = new Logger();
$logger2->log("Another log");

// 3. Использование `use` с псевдонимом (alias) при конфликте имён
use MyVendorMyAppLogger as AppLogger;
use FrameworkLoggingLogger as FrameworkLogger;

$appLog = new AppLogger();
$fwLog = new FrameworkLogger();

// 4. Импорт функции из namespace (требует PHP 5.6+)
use function MyVendorMyAppUtilsdebug;
debug([1, 2, 3]);

Глобальное пространство имён: Классы и функции, объявленные без namespace, или с обратным слэшем в начале, находятся в глобальном пространстве.

// Обращение к встроенному классу PHP из пространства имён
$dt = new DateTime(); // Явное указание глобального пространства

// Или после импорта
use DateTime;
$dt = new DateTime();

Пространства имён — обязательный инструмент для структурирования кода в современных PHP-проектах и при работе с Composer (PSR-4 autoloading).