Загрузка данных
 
Логин:   Пароль:      
Регистрация   Забыли пароль?

15 горячих:


Сообщество

Статьи

Сюда складываются серьёзные и концептуальные материалы

Публикации   Пользователи   RSS
Закрыть
Загрузить:
Указать:
Выравнивание:
Альт

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



В части 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
Метки: PHP 5.3 Namespaces
Tracker 17 июля 2009 14:17 комментариев: 0
:) 0 :(

Комментарии:
К этой публикации пока нет комментариев.
Только зарегистрированные пользователи могут оставлять комментарии.
© 2008 | О сайте | Инструкции | Обратная связь
© Powered by BigStreet

Работа с БД:
 Время - 0.0546
 Запросов - 11
Работа с кэшем:
 Время - 0.004
 Записей - 2
 Прочтений - 5
Общее время:
 0.117