Пространства имен используются для решения двух задач:
- решение конфликтов имен классов (функции, контстант), т.е. появляется класс (функция, константа) с таким же именем, которе уже есть в системе.
- создание сокращений для Очень_Длинных_Имен_Классов, которые являлись единственным решением первой задачи во времена когда не было пространст имен.
Рассмотрим ситуацию, при которой уже существует некий класс с именем Controller и нужно создать еще один класс с таким же именем. Для этой задачи, начиная с версии 5.3 в PHP существует ключевое слово «namespace».
Итак, у нас есть файл a.php:
<?
namespace A;
class Controller {
public function __construct() {
echo 'This is controller of namespace A';
}
public static function call() {
echo 'This is static method of controller of namespace A';
}
}
и файл b.php
<?
namespace B;
class Controller {
public function __construct() {
echo 'This is controller of namespace B';
}
public static function call() {
echo 'This is static method of controller of namespace B';
}
}
Теперь в неком третьем файле создадим экземпляр объекта Controller из пространства имен A:
<?
include ('a.php');
$controllerA = new \A\Controller();
В результате выполенния появится надпись «This is controller of namespace A»
Соответственно экземпляр объекта Controller из пространства имен B создается:
<?
include ('b.php');
$controllerA = new \B\Controller();
Обращение к статическим методам выглядит также:
\A\Controller::call(); // выведет «This is static method of controller of namespace A»
\B\Controller::call(); // выведет «This is static method of controller of namespace B»
Немного об операторе use
Часто вместе с «namespace» можно увидеть оператор «use», который может использоваться в двух случаях.
Первый случай использования оператора «use» рассмотрим на следующем примере. У нас уже есть объявленный выше файл a.php и для создания экземпляра объекта делаем следующее:
<?
include ('a.php');
use A\Controller;
$controllerA = new Controller();
Во втором случае оператор «use» используется для создания псевдонима имени. Например, у нас есть файл c.php:
<?
namespace Application\Admin\Pages;
class Controller {}
Чтобы при создании экземпляра объекта не тащить за собой весь «паровоз» Application\Admin\Pages делаем так:
<?
use Application\Admin\Pages\Controller as C;
$controller = new C();
Это все о чем хотелось бы упомянуть в этой памятке. На самом деле, это лишь часть функционала пространства имен, но именно она используется наиболее часто.