
В части 1 и 2 нашей серии статей мы рассмотрели основы пространства имён, а также импортирование, псевдонимы и правила разбора имён. В данной, заключительной, статье мы обговорим некоторые более продвинутые опции пространства имён.
Константа __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
Ключевое слово namespace может использоваться для того чтобы явно указать источник позиции (дать на него ссылку) в пределах текущего пространства имён или подпространства имён. Эквивалент namespace — ключевое слово self для классов:
- <?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 может быть "App\Lib1\MyClass". Вы можете продолжить размещать Ваши файлы 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);
-
- }
- ?>
Пояснение:
- Используем псевдоним MC для класса App\Lib1\MyClass
- Во время компиляции new MC() транслируется в new App\Lib1\MyClass().
- Строка "App\Lib1\MyClass" передается функции __autoload. Это заменяет все обратные слэши пространств имён на прямые слэши пути файла, и видоизменяет строку таким образом, что загружается файл "classes\App\Lib1\MyClass.php".
Я надеюсь что Вам пригодится эта серия статей о пространствах имён PHP. Будете ли Вы использовать пространства имён в своем PHP коде?
Читайте также:
Как использовать пространства имен в PHP, Часть 1: Основы
Как использовать пространства имён в PHP, Часть 2: Импортирование, псевдонимы и правила разбора имён
Примечания:
A/ Во время работы над переводом, когда искал очередной термин, нашел здесь эту же третью часть, но уже переведенную. На мой взгляд, в том переводе содержатся достаточно грубые ошибки, сравните:
Ключевое словов namespace может быть использован для четкой связи между текущим пространством имени и подпространствами на подобии self в классах
Мой перевод:
Ключевое слово namespace может использоваться для того чтобы явно указать источник позиции (дать на него ссылку) в пределах текущего пространства имён или подпространства имён. Эквивалент namespace — ключевое слово self для классов
B/ Замечания, поправки, указания на неточности и проч. — приветствуются!
C/ Код подсвечен с помощью Source Code Highlighter.



комментарии (10)