Пространство имен PHP.




Пространство имён — это некоторое хранилище, созданное для абстрактной группировки уникальных идентификаторов (имён) т.е. если использовать пространства имён, то можно подключать сторонние библиотеки и не бояться, что там будут такие же имена, как и в вашем коде.

Пространства имен объявляются с помощью зарезервированного слова «namespace». Файл, содержащий пространство имен, должен содержать его объявление в начале перед любым другим кодом, кроме зарезервированного слова declare.

Объявление единого пространства имен:

namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

Только выражение declare может находиться перед объявлением пространства имен для указания кодировки файла.

Так же как файлы и каталоги, пространства имен PHP позволяют создавать иерархию имен. Таким образом, имя пространства может быть определено с подуровнями:

namespace MyProject\Sub\Level;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

Теория относительности

PHP всегда работает относительно текущего пространства имен. Пример:

namespace Model;
$user = new User();

Добавив директиву пространства имен, мы автоматически отнесли исполнение скрипта к этому пространству. Теперь, при создании объекта типа User, мы получаем экземпляр класса из пространства имен Model. В этом и заключается относительность. Но чтобы создать первый класс User существует маневр для использования классов принадлежащих к глобальному пространству. Надо просто добавить обратный слеш «\» к имени класса. По этому символу PHP определяет в каком пространстве имен искать указанный класс.

$user = new \User();

Чтобы каждый раз не ставить символ обратного слеша «\» разработчики PHP позаботились об этом и предоставили такую директиву, как use. При помощи этой директивы можно перемещать класс из одного пространства в другое:

namespace Model;

use Auth\Member;

$member = new Member();

Еще есть одна хорошая директива «as» с её помощью можно задать нужному классу имя и обращаться к нему по имени. Такую директиву можно применить при использовании одноименных классов. Пример использования:

namespace Model;

use Auth\Member as AuthMember;

$member = new AuthMember();

При помощи use можно подключить сколько угодно классов:

namespace Model;

use Auth\User;
use Blog\Post;
use Blog\Tag;
use Api\User as ApiUser;

Структура

Пространства имен помогают не только избежать конфликтов, но и структурировать проект. Допустим, вы создаете библиотеку и при этом не хотите причинить вреда уже написанному коду пользователя. Так можно обойти все связанные с этим проблемы:

MyNamespace\Blog\Content\Post
MyNamespace\Blog\Content\Page
MyNamespace\Blog\Tag

Нужно использовать своё имя для пространства имён, чтобы разъединить код библиотеки и код пользователя, который будет её использовать. Внутри корневого пространства имен своей библиотеки нужно использовать другие подпространства для логического деления функционала.

Константа __NAMESPACE__

__NAMESPACE__ это строка PHP, которая всегда возвращает текущее имя пространства имён. В глобальном пространстве она будет всегда пустой строкой.

namespace App\Lib1;
echo __NAMESPACE__; // outputs: App\Lib1

Её значение имеет выгоду во время отладки. Её также можно использовать чтобы динамически генерировать полные квалифицированные имена классов:

namespace App\Lib1;

class MyClass {
	public function WhoAmI() {
		return __METHOD__;
	}
}

$c = __NAMESPACE__ . '\\MyClass';
$m = new $c;
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI

В заключении…

Cледуйте следующим правилам что применять пространства имен правильно и использовать только там где необходимо.

  • Используйте уникальный корень для пространства имен;
  • Используйте только одно пространство имен в каждом файле;
  • Проверьте наличие в пространстве имен каждого класса/интерфейса;
  • Поставьте каждый класс/интерфейс в собственный файл и ничего больше туда не добавляйте;
  • Не добавляйте функции в пространство имен.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Chinese (Traditional)EnglishJapaneseRussianUkrainian

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: