Что такое пространство имен — namespaces — в PHP?

Доброго времени суток, уважаемые читатели нашего блога! В прошлой статье мы начали тему, связанную с объектно-ориентированным программированием в PHP. Сегодня мы копнем поглубже и рассмотрим пространство имен — namespaces — в языке PHP, используя простые примеры программирования. И первая хорошая новость – Namespaces прост в изучении. Начнем!
Создадим класс в PHP

<?php
class Foo
{
  public function doAwesomeFooThings ()
  {
   // здесь должен быть ваш код
  }
}
?>


Мы заполняем PHP 5.2 класс, который делает много важных вещей. Например, скажем «Привет» читателям:

<?php
  class Foo
  {
  public function doAwesomeFooThings ()
    {
     echo “Привет, читатели!”;
  }
  }
  ?>

Как использовать класс Foo? Использование Foo простое, напишем:

<?php
  require ‘foo.php’;
  $foo = new Foo();
  ?>

Для того, чтобы идти в ногу со временем, давайте используем новое понятие, которое появилось в PHP 5.3 — пространство имен Namespace. Пространство имен (namespace) используется подобно вложенным папкам, добавим это пространство, расположенное в Acme\Tools.

<?php
// это файл foo.php
namespace Acme\Tools; 
class Foo
{
  public function doAwesomeFooThings ()
  {
    echo “Привет, читатели”;
  }
}
?>

Для использования Foo нужно назвать его по-новому. Это будет ссылка на файл, представляющая собой полный путь.

<?php
require ‘foo.php’;
$foo = new \Acme\Tools\Foo();
?>

Вот и все. Добавляя пространство имен в класс – это словно организация файлов из одной директории в несколько поддиректорий. Для ссылки на класс используйте его имя, начинающееся со слеша «\». Большое имя воспринимается тяжело, поэтому давайте добавим короткое. Для этого дадим классу \Acme\Tools\Foo() псевдоним.

<?php
require ‘foo.php’;
use \Acme\Tools\Foo as SomeFooClass;
$foo = new SomeFooClass();
?>

Можно как-нибудь назвать класс, либо использовать имя по умолчанию Foo.

<?php
require ‘foo.php’;
use \Acme\Tools\Foo;
$foo = new Foo();
?>


Хорошо. Как насчет старых классов PHP без имени пространства? Для этого перейдем к подходящему для нашего случая классу datetime. И возьмем несколько новых фишек от PHP 5.3. Создание нового объекта даты datetime выглядит аналогично:

<?php
require ‘foo.php’;
use \Acme\Tools\Foo;
$foo = new Foo();
$dt = new DateTime();
?>

Для обычного файла это все еще работает. А вот в файле с объявлением пространства namespace PHP считает, что речь идет о файле в директории \Acme\Tools:

<?php
namespace Acme\Tools; 
class Foo
{
  public function doAwesomeFooThings ()
  {
     echo “Hi listeners”;
     // здесь поиск будет вестись в директории \Acme\Tools
     $dt = new DateTime(); 
  }
}
?>

Или вы можете сослаться на класс в глобальном пространстве, используя полное имя \Datetime:

<?php
namespace Acme\Tools; 
class Foo
{
  public function doAwesomeFooThings ()
  {
     echo “Hi listeners”;
     // здесь поиск будет вестись в глобальном пространстве
     $dt = new \DateTime();
  }
}
?>

Предыдущий фрагмент кода показывает, что мы обращаемся к глобальному классу DateTime

Чтобы обратиться глобальному классу DateTime можно это сделать с помощью use:

<?php
namespace Acme\Tools; 
use \DateTime;
class Foo
{
  public function doAwesomeFooThings ()
    {
     echo “Hi listeners”;
     // здесь поиск будет вестись в глобальном пространстве
     $dt = new DateTime();
  }
}
?>


Использование use выглядит глупо, но оно говорит PHP, что когда вы вызываете DateTime, вы имеете в виду класс без имени, указывающий на время. Если убрать слэш перед DateTime, то все будет работать точно так же.

<?php
namespace Acme\Tools; 
use DateTime;
class Foo
{
  public function doAwesomeFooThings ()
  {
     echo “Hi listeners”;
     // здесь поиск будет вестись в глобальном пространстве
     $dt = new DateTime();
  }
}
?>

И вы даже не заметите этого. ОК. Пока!

P.S.