Доброго времени суток дорогой читатель. Сегодня мы рассмотрим что такое неймспейс (namespace) в php. Это знание нам понадобиться, так как движок RS-MINI будет с ними работать. Мало того, CMS будет, ориентируясь на пространство имен, автоматически подключать необходимые классы. Ну об этом чуть позже, а сейчас — для чего именно нужны неймспейсы?
Когда пишется проект (тот же движок например) зачастую приходится писать одни и те же вещи. Алгоритм удаления, алгоритм вставки, редактирования и чтения. Каждый раз для функций или классов приходится придумывать названия типа addArticle, addNews и все это потому что в скрипте не должно быть дублей сущностей (это я про функции и классы).
А так хотелось бы для модуля news и для модуля article использовать имена классов
не беспокоясь о том, что они пересекутся и выдадут fatal error
Вот тут как раз и приходит на помощь пространство имен. Давайте предположим что у нас есть три неких файла. Два из них содержит функцию с одинаковым именем, но разным алгоритмом. Третий подключает эти два файла.
Файл 1.php
<?php
function getName()
{
return "Алексей";
}
Файл 2.php
<?php
function getName()
{
return "Василий";
}
Файл 3.php
<?php
require_once('1.php');
require_once('2.php');
При запуске третьего файла (3.php) мы увидим вот такое сообщение
оно говорит нам что функция getName() уже существует, и php не может объявить еще одну такую же функцию.
Теперь давайте назначим для первых двух файлов неймспейсы.
Файл 1.php
<?php
namespace a; // пространство имен a
function getName()
{
return "Алексей";
}
Файл 2.php
<?php
namespace b; // пространство имен b
function getName()
{
return "Василий";
}
По синтаксису могу сказать что ключевое слово namespace должно стоять перед любой логикой php, т. е. в самом верху. Так же желательно использовать только латинские буквы и обратный слэш (\) для обозначения пространства.
Прежде чем вернуться к особенностям наименования неймспейсов давайте попробуем вызвать эти функции
Файл 3.php
<?php
require_once('1.php');
require_once('2.php');
// вызов функции из первого файла
echo \a\getName();
echo "<br>";
// вызов функции из второго файла
echo \b\getName();
вот что мы увидим на экране
Как видите обращение к функции из 1-ого файла (и к функции из второго тоже) я начал с обратного слэша. Это не спроста. Неймспейсы работают по принципу пути. Давайте что-бы увидеть как все устроено, добавим в третий файл свое пространство имен
Файл 3.php
<?php
namespace c; // определяем неймспейс c
require_once('1.php');
require_once('2.php');
echo \a\getName();
echo "<br>";
echo \b\getName();
запустив этот скрипт мы увидим что все нормально
А теперь давайте удалим у вызова функций первый обратный слэш
Файл 3.php
<?php
namespace c;
require_once('1.php');
require_once('2.php');
// убрали обратный слэш
echo a\getName();
echo "<br>";
// убрали обратный слэш
echo b\getName();
запустив увидим вот такое сообщение
Обратите внимание какой вызов сделал php. Не как нам нужно a\getName() а c\a\getName(). Убрав первый обратный слэш при вызове, мы указали не полный путь а относительный. Именно поэтому указанное нами пространство, при вызове функции getName(), приклеилась к неймспейсу файла из которого была вызвана эта самая функция (т. е. пространство из 3-ого файла)
Исходя их этого можно сделать вывод что неймспейсы по сути как папки в операционной системе. Мы ведь можем создать два файла с одним именем но в разных папках. Вот и тут, мы можем создать две функции с одним именем но в разных неймспейсах.
Очень редко программисты используют в качестве имени для пространства одно слово. Обычно это ряд вложенностей, которые в проектах бывают не маленькими. Например неймспейс может быть вот таким:
test\Name\Space\Article\My\Blog\A
и согласитесь писать такую хрень перед вызовом функции очень проблематично. Именно поэтому вот для таких длинных пространств можно указать псевдоним.
Давайте отредактируем наши файлы вот так
Файл 1.php
<?php
// новое пространство
namespace test\Name\Space\Article\My\Blog\A;
function getName()
{
return "Алексей";
}
Файл 2.php
<?php
// новое пространство
namespace test\Name\Space\Article\My\Blog\B;
function getName()
{
return "Василий";
}
и попробуем вызвать функции как мы это делали ранее
Файл 3.php
<?php
require_once('1.php');
require_once('2.php');
// вызов функции из первого файла указывая неймспейс на прямую
echo \test\Name\Space\Article\My\Blog\A\getName();
echo "<br>";
// вызов функции из второго файла указывая неймспейс на прямую
echo \test\Name\Space\Article\My\Blog\B\getName();
вот что выдает скрипт
вроде работает. Теперь давайте назначим псевдоним
Файл 3.php
<?php
// назначаем псевдоним для неймспейса из первого файла
use \test\Name\Space\Article\My\Blog\A as aliasA;
// назначаем псевдоним для неймспейса из второго файла
use \test\Name\Space\Article\My\Blog\B as aliasB;
require_once('1.php');
require_once('2.php');
// вызываем функцию из первого файла используя алиас
echo aliasA\getName();
echo "<br>";
// вызываем функцию из второго файла используя алиас
echo aliasB\getName();
Синтаксис прост: ключевое слово use + неймспейс + ключевое слово as + псевдоним
Теперь мы может достучаться до функций указывая назначенный псевдоним, а именно aliasA и aliasB
Забегая вперед хочу сказать, что вот эти имена пространств, можно использовать для того что бы найти и подключить с помощью require_once необходимый класс. Именно это и называется автоподключением, о котором мы совсем скоро поговорим
Всего Вам наилучшего, на сегодня все