В частях 1 и 2 этой серии мы рассмотрели основы пространства имен PHP, оператор использования и разрешение имен . В этой заключительной статье мы обсудим некоторые из более сложных вариантов пространства имен.
Константа __NAMESPACE__
__NAMESPACE__ — это строка PHP, которая всегда возвращает текущее имя пространства имен. В глобальном пространстве это будет пустая строка.
<?php namespace App\Lib1; echo __NAMESPACE__; // outputs: App\Lib1 ?>
Значение имеет очевидные преимущества во время отладки. Он также может использоваться для динамического создания полного имени класса, например
<?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } $c = __NAMESPACE__ . '\\MyClass'; $m = new $c; echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI ?>
Ключевое слово пространства имен
Ключевое слово namespace
может использоваться для явной ссылки на элемент в текущем пространстве имен или подпространстве имен. Это эквивалент пространства имен внутри классов:
<?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } $m = new namespace\MyClass; echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI ?>
Автозагрузка классов пространств имен
Одной из лучших функций PHP 5, позволяющих экономить время, является автозагрузка. В глобальном (без пространства имен) PHP-коде можно написать стандартную функцию автозагрузки:
<?php $obj1 = new MyClass1(); // classes/MyClass1.php is auto-loaded $obj2 = new MyClass2(); // classes/MyClass2.php is auto-loaded // autoload function function __autoload($class_name) { require_once("classes/$class_ name.php"); } ?>
В PHP 5.3 вы можете создать экземпляр класса пространства имен. В этой ситуации полностью определенное пространство имен и имя класса передаются в функцию __autoload, например, значение $ class_name может быть «AppLib1MyClass». Вы можете продолжать размещать все файлы классов PHP в одной папке и удалять пространство имен из строки, однако это может привести к конфликтам имен файлов.
Кроме того, иерархия файлов вашего класса может быть организована так же, как ваша структура пространства имен. Например, файл MyClass.php может быть создан в папке / classes / App / Lib1:
\ Classes \ App \ Lib1 \ MyClass.php:
<?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } ?>
Файл в корневой папке может затем использовать следующий код:
myapp.php:
<?php use App\Lib1\MyClass as MC; $obj = new MC(); echo $obj->WhoAmI(); // autoload function function __autoload($class) { // convert namespace to full file path $class = 'classes\' . str_replace('\\', '/', $class) . '.php'; require_once($class); } ?>
Объяснение:
- Класс AppLib1MyClass имеет псевдоним MC.
-
new MC()
переводится вnew AppLib1MyClass()
во время компиляции. - Строка «AppLib1MyClass» передается в функцию __autoload. Это заменяет все обратные косые черты пространства имен на прямые косые черты пути к файлу и изменяет строку так, чтобы загружался файл «classesAppLib1MyClass.php».
Я надеюсь, что вы нашли эту серию статей о пространствах имен PHP полезной. Будете ли вы использовать пространство имен в своем коде PHP?
Смотрите также: