Статьи

Как использовать пространства имен PHP, часть 3: ключевые слова и автозагрузка

PHP namespaces В частях 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); } ?> 

Объяснение:

  1. Класс AppLib1MyClass имеет псевдоним MC.
  2. new MC() переводится в new AppLib1MyClass() во время компиляции.
  3. Строка «AppLib1MyClass» передается в функцию __autoload. Это заменяет все обратные косые черты пространства имен на прямые косые черты пути к файлу и изменяет строку так, чтобы загружался файл «classesAppLib1MyClass.php».

Я надеюсь, что вы нашли эту серию статей о пространствах имен PHP полезной. Будете ли вы использовать пространство имен в своем коде PHP?

Смотрите также: