Пространства имен, это один из способов инкапсуляции элементов. Такое абстрактное понятие можно увидеть во многих местах. Например, в операционной системе директории служат для группировки файлов и выступают в качестве пространства имен для находящихся в них файлов. В качестве примера файл text.txt может находиться сразу в нескольких директориях: /files и /docs, но две копии text.txt не могут существовать в одной директории. Также, для доступа к text.txt извн, мы должны добавить имя директории перед именем файла используя разделитель (/files /text.txt). Такой же принцип распространяется и на пространства имен.

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

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

Пример использования.

Допустим, у нас такая файловая структура:

-- App
--- Main
---- MyClass.php
- namespace.php

Опишем класс MyClasss.php:

<?php
// App/Main/MyClass.php

namespace App\Main;

class MyClass {	
	function hello() {
		return "hello";
	}
}
?>

С помощью пространст имен мы можем получить доступ к классу MyClass (файл namespace.php):

<?php
// namespace.php

namespace App\Main;

require_once "App\Main\MyClass.php";

$obj = new \App\Main\MyClass;
echo $obj->hello(); // hello
?>

Исходя из описания, мы можем создать такой же класс, только в другой директории. Давайте создадим класс с таким же названием в папке App/Core.

<?php
// App/Core/MyClass.php

namespace App\Core;

class MyClass {	
	function hello() {
		return "hello, it's core";
	}
}
?>

Получим доступ к этому классу:

<?php
namespace App\Core;

require_once "App\Core\MyClass.php";

$obj = new \App\Core\MyClass;
echo $obj->hello(); // hello it’s core
?>

Создание псеводима имени

Псевдонимы для пространст имен используються для более просто доступа к нужному пространству. Например, у вас такая структура namespace App/Core/Controller/, чтобы получить доступ к одному из классов, нужно будет написать весь этот путь, например, App/Core/Controller/AppController.php. Намного проще было бы написать CoreController/AppController.php. Это можно реализовать с помощью псеводнимов.

Для создания псевдонима используют ключевое слово use.

Пример:

<?php
use App/Core/Controller as CoreController;

// …

$app = new CoreController\AppControoler.php;
?>