Когда вы используете классы из разных библиотек (и даже классы из разных компонентов одной библиотеки)
в вашей программе, имена классов могут конфликтовать между собой.
Это значит, что, имея два класса с одинаковыми именами, вы столкнетесь с ошибкой интерпретатора PHP.
Если вы когда-нибудь разрабатывали сайты с Zend Framework 1, вы, возможно, помните супердлинные
имена классов вроде Zend_Controller_Abstract
. Длинные имена использовались для того, чтобы
избежать конфликтов имен между различными компонентами. У каждого компонента был собственный префикс,
например, Zend_
или My_
.
Zend Framework 3 для этих целей используют такую особенность языка PHP, как пространства имен (namespaces). Они позволяют разрешить конфликты имен между компонентами кода и предоставляют вам возможность существенно сократить эти имена.
Пространство имен - это такой контейнер для группы имен. Вы можете вложить одно пространство имен в другое.
Если класс не определяют пространство имен, они существуют в глобальном пространстве имен
(например, глобальному пространству имен принадлежат классы Exception
и DateTime
).
Ниже представлен пример определения пространства имен, взятый из компонента Zend\Mvc
:
<?php
namespace Zend\Mvc;
/**
* Главный класс приложения.
*/
class Application
{
// ... элементы класса опущены для простоты ...
}
В Zend Framework 3, все классы принадлежат пространству имен верхнего уровня Zend.
Строка 2 определяет пространство имен Mvc, которое вложено в Zend,
и все классы этого компонента (включая класс Application
, представленный в этом
примере в строках 7-10) принадлежат этому пространству имен. Вложенные пространства имен
разделяются обратным слешем. ('\').
В других частях кода, вы ссылаетесь на класс Application
, используя
его полностью определенное имя:
<?php
$application = new \Zend\Mvc\Application();
Обратите внимание на первый обратный слеш в имени
\Zend\Mvc\Application
Если имя класса начинается с обратного слеша, значит, это имя - полностью определенное. Если имя класса возможно специфицировать относительно текущего пространства имен, этот обратный слеш не используется.
Также можно использовать псевдонимы (aliases) (короткие имена классов) с помощью
оператора use
:
<?php
// Определяем псевдоним в начале сайта.
use Zend\Mvc\Application;
// Затем используем короткое имя класса.
$application = new Application();
Хотя псевдонимы позволяют использовать короткие имена классов, использовать их необязательно - вы точно также можете обращаться к классу по его полностью определенному имени.
Каждый PHP-файл приложения, как правило, определяет пространство имен (кроме входного файла index.php и файлов конфигурации, они обычно этого не делают). Например, главный модуль вашего сайта, Application, определяет свое собственное пространство имен с одноименным названием:
<?php
namespace Application;
class Module
{
// ... элементы класса опущены для простоты ...
}