Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Пространства имен в PHP, разъяснение

Anna | 29.05.2014 | нет комментариев

Прим.пер.: Я в курсе, что на момент перевода актуальная версия PHP — 5.5, а также что есть умная книга мануал. Но мне показалось увлекательным, то как автор преподносит namespace функционал, допустимо кому-то из тех, кто только осваивает азы (да и не только, есть много бородатых разработчиков, остановившихся на PHP 5.2), статья поможет проникнуться. Ходор.

В PHP, начиная с версии 5.3 возникли пространства имен. Множество современных языков теснее давным-давно заимели себе такой функционал, но PHP немножко опаздывал. Тем не менее, у всякой новой функции есть свое призвание, давайте узнаем, какие выгоды мы можем извлечь, применяя namespace.

В PHP у вас не может быть два класса, названных идентично, все они обязаны быть уникальны. Задача этого ограничения в том, что если вы используете чью-либо стороннюю библиотеку, предоставляющую класс с именем User, то вы не можете сделать свой личный класс, также названный User. Это по настоящему гнусно, чай User — дюже комфортно имя для класса, не так ли?

Пространства имен разрешают нам обойти эту задачу, и мы можем сделать столько классов User, сколько нам потребуется.Помимо того пространства имен дозволят нам организовать код в комфортные пакеты, а также обозначить свои права владения этим кодом.

Давайте взглянем на самый обыкновенный класс. Да… я знаю, что вы теснее применяли их, при чем тут пространства имен? Легко доверьтесь мне в этом, ок?

Глобальное пространство имен

Вот такой, дюже примитивный класс:

<?php

// app/models/Eddard.php

class Eddard
{

}

Ничего исключительно, как видите, и если вы хотите применять его, легко сделайте так:

<?php

// app/routes.php

$eddard = new Eddard();

 

Дейл, я как бы, знаю PHP…

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

Примитивное применение пространств имён

Давайте сделаем еще одного Эддарда, рядом с тем, глобальным.

<?php

namespace Stark;

// app/models/another.php

class Eddard
{

}

Тут у нас дюже схожий класс с одним небольшим изменением, добавлена директива пространства имен. Строка namespace Stark; говорит PHP что мы трудимся в пространстве имен Stark и всякий код (объявление классов, функций, переменных и т.д.) будет относиться к нему.

Выходит, нам необходимо сделать нового Эдда, если вы решили что это необходимо сделать вот так:

<?php

// app/routes.php

$eddard = new Eddard();

То не, это не так. Тут мы получаем экземпляр класса из первого примере, тот, что мы сотворили ранее. Не тот, в пространстве имен Stark. Давайте испробуем сделать экземпляр Эддарда Старка.

<?php

// app/routes.php

$eddard = new Stark\Eddard();

Для создания экземпляра класса нам необходимо предварить имя класса префиксом из наименования пространства имен, которому класс пренадлежит, а в качестве разделителя применять обратную косую черту. В результате у нас есть экземпляр именно того класса, что нам необходим. разве это не волшебно?

К слову сказать, пространства имён может образовывать сколь желательно трудную иерархию, применяя столько ярусов, сколько понадобится. Скажем:

This\Namespace\And\Class\Combination\Is\Silly\But\Works

 

Теория относительности

Помните, как я сказал вам, что PHP неизменно работает касательно нынешнего пространства имен. Давайте взглянем на это в действии:

<?php

namespace Stark;

// app/routes.php

$eddard = new Eddard();

Добавив директиву пространства имён, мы дали осознать PHP, что мы находимся в пространстве имён Stark. Так как именно в нем мы определили класс Eddard, то именно его мы и получим. Видите — все касательно.

Теперь, когда мы изменили пространство имён, у нас появилась одна крошечная задача. Есть идеи, о чем я? А как нам сейчас получить наш подлинный класс Eddard? Ну тот, тот, что в глобальном пространстве?

К счастью в PHP есть трюк, тот, что дозволит нам решить эту задачу — легко добавив \ к имени класса.

<?php

// app/routes.php

$eddard = new \Eddard();

Видя ведущий слеш PHP понимает, что необходимо выглянуть за пределы нынешнего namespace и создает экземпляр надобного нам класса.

А теперь включи свое воображение. Представь, что у нас есть класс из пространства имен Tully\Edmure. Теперь нам необходимо применять его внутри пространства Stark. И как нам это сделать?

<?php

namespace Stark;

// app/routes.php

$edmure = new \Tully\Edmure();

И вновь нам пришлось применять обратный слеш Дабы перейти к всеобщей видимости, раньше чем сделать экземпляр класса пространстве Tully.

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

<?php

namespace Stark;

use Tully\Edmure;

// app/routes.php

$edmure = new Edmure();

Применяя директиву use, мы можем получить класс из иного пространства имён. Только пожалуйста, не спрашивайте меня, «а отчего мы не поставили тут косую черту в начале?», потому что я легко не знаю. Насколько я знаю — это исключительное исключение. Нет, вы можете применять косую черту тут. но смысла в этом не будет никакого.

А, еще один небольшой трюк! Мы можем дать нашим импортируемым классам прозвища:

<?php

namespace Stark;

use Tully\Brynden as Blackfish;

// app/routes.php

$brynden = new Blackfish();

Применяя ключевое слово as, мы присвоили классу Tully/Brynden прозвище Blackfish, что разрешает нам применять новое прозвище для его идентификации в нынешнем пространстве имен. Искусно, не так ли? Это также дюже комфортно, если вам необходимо применять два класса, названных идентично, в пределах одного пространства имён:

<?php

namespace Targaryen;

use Dothraki\Daenerys as Khaleesi;

// app/routes.php

class Daenerys
{

}

// Targaryen\Daenerys
$daenerys = new Daenerys();

// Dothraki\Daenerys
$khaleesi = new Khaleesi();

Давая Daenerys из пространства Dothraki прозвище Khaleesi, мы можем применять оба класса Daenerys. Достаточно комфортно, там мы можем применять все нужные классы в нашем приложении.

<?php

namespace Targaryen;

use Dothraki\Daenerys;
use Stark\Eddard;
use Lannister\Tyrion;
use Snow\Jon as Bastard;

Конструкция

Пространства имен также могут подмогнуть нам в организации нашего кода. Дозвольте, я продемонстрирую.

Скажем, я хочу сделать библиотеку с открытым начальным кодом. Мне бы дюже хотелось, Дабы другие могли применять мой код, это было бы здорово! Напасть в том, что имена классов в моем коде конфликтовали с собственным приложением пользователя моей библиотеки. Это было бы жутко неудобно. Вот как я решу эту задачу:

Dayle\Blog\Content\Post
Dayle\Blog\Content\Page
Dayle\Blog\Tag

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB