Ответ
Пространства имён (namespaces) в PHP — это механизм для инкапсуляции и организации элементов кода (классов, интерфейсов, функций и констант), предназначенный для решения двух основных проблем:
- Избежание конфликтов имён между кодом вашего приложения, внутренними классами PHP и сторонними библиотеками.
- Создание псевдонимов (алиасов) для длинных имён, что улучшает читаемость кода.
Без 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).