
В части 1-й и части 2-й этой серии, были рассмотрены основы пространства имен PHP, оператор use и разрешение имен. В этой, финальной статье, будут затронуты более сложные методы применения пространства имен.
Константа __NAMESPACE__ __NAMESPACE__ это строка которая возвращает текущее пространство имен. Если мы работаем в глобальном пространстве, она будет пустой.
<code class="php"> <?php
namespace App\Lib1;
echo __NAMESPACE__; // вывод: App\Lib1
?>
</code>
Очевидна польза данного значения во время отладки, так же его можно использовать для генерации полного имени класса, например:
<code class="php"> <?php
namespace App\Lib1;
class MyClass {
public function WhoAmI() {
return __METHOD__;
}
}
$c = __NAMESPACE__ . '\\MyClass';
$m = new $c;
echo $m->WhoAmI(); // вывод: App\Lib1\MyClass::WhoAmI
?>
</code>
Ключевое словов namespaceКлючевое словов namespace может быть использован для четкой связи между текущим пространством имени и подпространствами на подобии self в классах:
<code class="php"> <? php
namespace App\Lib1;
class MyClass {
public function WhoAmI() {
return __METHOD__;
}
}
$m = new namespace\MyClass;
echo $m->WhoAmI(); // вывод: App\Lib1\MyClass:: WhoAmI
?>
</code>
Автозагрузка классов пространства именОдна из лучших возможностей PHP 5 которая сохранит вам время это автозагрузка. В глобальном (неименованном пространстве) PHP функция автозагрузки может быть написана следующим образом:
<code class="php"> <? php
$obj1 = new MyClass1(); // classes/MyClass1.php загружен автоматически
$obj2 = new MyClass2(); // classes/MyClass2.php загружен автоматически
// функция автозагрузки
function __autoload($class_name) {
require_once(«classes/$class_name.php»);
}
?>
</code>
В PHP 5.3 вы можете создавать экземпляр класса пространства имен. В этой ситуации полные пространства имен и имена классов передаются функции __autoload, например значение $class_name может быть «App\Lib1\MyClass». Вы можете продолжать размещать все ваши файлы PHP классов в том же каталоге и разделять пространства имен в строке, тем не менее, это приведет к конфликту имен.
Альтернатива, ваша иерархия классов может быть организована так же как и структура вашего пространства имен. Для примера, файл MyClass.php может быть создан в папке /classes/App/Lib1:
/classes/App/Lib1/MyClass.php:
<code class="php"> <? php
namespace App\Lib1;
class MyClass {
public function WhoAmI() {
return __METHOD__;
}
}
?>
</code>
Файл в корневой папке может использовать следующий код:
myapp.php:
<? php
use App\Lib1\MyClass as MC;
$obj = new MC();
echo $obj->WhoAmI();
// функция автозагрузки
function __autoload($class) {
// конвертируется пространство имени в полный путь к файлу
$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 коде?
ИсточникHow to Use PHP Namespaces, Part 2: Importing, Aliases, and Name Resolution