Коротко о namespace в php

 

Доброго времени суток дорогой читатель. Сегодня мы рассмотрим что такое неймспейс (namespace) в php. Это знание нам понадобиться, так как движок RS-MINI будет с ними работать. Мало того, CMS будет, ориентируясь на пространство имен, автоматически подключать необходимые классы. Ну об этом чуть позже, а сейчас — для чего именно нужны неймспейсы?

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

А так хотелось бы для модуля news и для модуля article использовать имена классов

  • browse (для чтения)
  • add (вставка)
  • edit (редактирование)
  • delete (удаление)

не беспокоясь о том, что они пересекутся и выдадут fatal error

Namespace

Вот тут как раз и приходит на помощь пространство имен. Давайте предположим что у нас есть три неких файла. Два из них содержит функцию с одинаковым именем, но разным алгоритмом. Третий подключает эти два файла.

Файл 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) мы увидим вот такое сообщение

cannot redeclare

оно говорит нам что функция 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();

вот что мы увидим на экране

вывод функции getName()

Как видите обращение к функции из 1-ого файла (и к функции из второго тоже) я начал с обратного слэша. Это не спроста. Неймспейсы работают по принципу пути. Давайте что-бы увидеть как все устроено, добавим в третий файл свое пространство имен

Файл 3.php

<?php

namespace c; // определяем неймспейс c

require_once('1.php');
require_once('2.php');

echo \a\getName();
echo "<br>";
echo \b\getName();

запустив этот скрипт мы увидим что все нормально

вывод функции getName()

А теперь давайте удалим у вызова функций первый обратный слэш

Файл 3.php

<?php

namespace c;

require_once('1.php');
require_once('2.php');

// убрали обратный слэш
echo a\getName();
echo "<br>";
// убрали обратный слэш
echo b\getName();

запустив увидим вот такое сообщение

undefined function

Обратите внимание какой вызов сделал php. Не как нам нужно a\getName() а c\a\getName(). Убрав первый обратный слэш при вызове, мы указали не полный путь а относительный. Именно поэтому указанное нами пространство, при вызове функции getName(), приклеилась к неймспейсу файла из которого была вызвана эта самая функция (т. е. пространство из 3-ого файла)

Исходя их этого можно сделать вывод что неймспейсы по сути как папки в операционной системе. Мы ведь можем создать два файла с одним именем но в разных папках. Вот и тут, мы можем создать две функции с одним именем но в разных неймспейсах.

Use

Очень редко программисты используют в качестве имени для пространства одно слово. Обычно это ряд вложенностей, которые в проектах бывают не маленькими. Например неймспейс может быть вот таким:

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();

вот что выдает скрипт

вывод функции 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 необходимый класс. Именно это и называется автоподключением, о котором мы совсем скоро поговорим

Всего Вам наилучшего, на сегодня все

Если Вам не хочется постигать все тонкости создания своего сайта с нуля, то у Вас всегда есть возможность заказать его (сайт). Например веб студия Оренбурга, предлагает создать, и даже раскрутить сайт за вполне не кусачие цены. Они на рынке с 2005-го года, и на их счету более 500 успешных проектов.
 

Возможно Вам будут интересны следующие заметки

Комментарии (0)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
К данной статье пока нет комментариев.