Калининград+7.962.2626.555

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

10.07.2015

Пространства имен используются для решения двух задач:

  1. решение конфликтов имен классов (функции, контстант), т.е. появляется класс (функция, константа) с таким же именем, которе уже есть в системе.
  2. создание сокращений для Очень_Длинных_Имен_Классов, которые являлись единственным решением первой задачи во времена когда не было пространст имен.

Рассмотрим ситуацию, при которой уже существует некий класс с именем 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();

Это все о чем хотелось бы упомянуть в этой памятке. На самом деле, это лишь часть функционала пространства имен, но именно она используется наиболее часто.