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

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

Что такое пространства имен вообще?

профан ответ с примером было бы здорово.

8 ответов


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

проще говоря,подумайте о пространстве имен как фамилии человека. Если есть два человека по имени "Джон" вы можете использовать их фамилии, чтобы отличить их друг от друга.

Сценарий

Предположим, вы пишете приложение, которое использует функция с именем output(). Ваш output() функция принимает весь HTML-код на Вашей странице и отправляет его пользователю.

позже ваше приложение становится больше, и вы хотите добавить новые функции. Вы добавляете библиотеку, которая позволяет создавать RSS-каналы. Эта библиотека также использует функцию с именем output() для вывода финальной подачи.

когда вы называете output(), как PHP знает, использовать ли ваш output() функция или библиотека RSS ? Это не так. если вы используете пространства имен.

пример

как мы решаем иметь два output() функции? Простой. Мы втыкаем друг output() функция сама по себе пространство имен.

это будет выглядеть примерно так:

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

позже, когда мы хотим использовать различные функции, мы будем использовать:

\MyProject\output();
\RSSLibrary\output();

или мы можем объявить, что мы находимся в одном из пространств имен, а затем мы можем просто вызвать это пространство имен output():

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

Нет Имен?

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


пространство имен позволяет разместить кучу кода под именем и не иметь конфликтов имен с классами, функциями и константами.

это позволяет вашему коду live в этом пространстве имен.

PHP использует несколько противоречивый характер \ для отображения уровней пространства имен. Люди встали с оружием в руках, потому что он также используется в качестве Escape-символа.

использовать пространства имен в PHP, используйте что-то вроде этого в верхней части файл.

namespace my\namespace;

Вы можете найти гораздо больше информации на официальная документация PHP для пространств имен.


существуют такие методы, как пространства имен в других языках программирования (например, пакеты в Java). Они используются для того, чтобы иметь классы mutliple с тем же именем в проекте.

из документации php (http://www.php.net/manual/en/language.namespaces.rationale.php):

Что такое пространства имен? В самом широком определении пространства имен-это способ инкапсуляции элементов. Во многих местах это можно рассматривать как абстрактное понятие. Для например, в любой операционной системе каталоги служат для группировки связанных файлов и выступают в качестве пространства имен для файлов в них. В качестве конкретного примера, файл foo.txt может существовать как в каталоге / home / greg, так и в /home/other, но в двух копиях foo.txt не может сосуществовать в одном каталоге. Кроме того, для доступа к ФОО.txt-файл вне каталога /home/greg мы должны добавить имя каталога к имени файла с помощью разделителя каталогов, чтобы получить /home/greg/foo.формат txt. Тот же принцип распространяется на пространства имен в мире программирования.


пространство имен в основном позволяет поместить код в контейнер. Это предотвратит проблемы с двумя функциями (а также классами и переменными), которые имеют одинаковое имя.

Они полезны при работе, когда большие приложения для предотвращения проблем с частями кода с одинаковым именем.

например, допустим, нам нужны две функции, называемые "TheMessage". Они оба будут печатать (Эхо) разные сообщения каждый. Обычно это вызывает синтаксическую ошибку, поскольку вы не может быть двух функций с одинаковым именем.

чтобы исправить это, вы можете поместить эти функции в отдельное пространство имен. Это позволит вам использовать обе функции без каких-либо ошибок.


пространство имен работает как каталог. Вы знаете, как вы можете поместить файлы в каталог с теми же именами, что и файлы в Родительском (или любом другом) каталоге? Ну, пространство имен позволяет вам сделать это в приложении для переменных, функций и классов.

некоторое время назад в PHP была тенденция к огромным классам статических функций. Единственный способ вызвать любую из этих функций - это префикс вызова с именем класса. Это была примитивная попытка пространства имен, но с не очень большой пользой.


как каталоги и файлы, пространство имен в PHP служит для группировки классы, функции, интерфейсы и константы.

пример:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

он обеспечивает способ упаковки элементов из глобального пространства и позволяет использовать простое имя элемента, не вызывая столкновения имен в программе. Он поддерживается в PHP 5.3.0, PHP 7.

но есть некоторые ограничения в аналогия между пространством имен PHP и файловой системой на основе Unix:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

принцип распространяется на пространство имен в программировании word.


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


поскольку легче узнать о ключевом слове "использовать", зная о" пространстве имен", позвольте мне сначала объяснить пространство имен, посмотрев на базовый проект Laravel.

есть класс с именем: .в PHP, который находится в пути: app / Http / контроллеры из корневого каталога проекта Существует также другой класс контроллера с именем:.в PHP, но это в пути: поставщик / laravel / framework/src/подсветка / маршрутизация из корневого каталога проекта

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

так на самом деле, наш первый контроллер класс: app / Http / контроллеры / контроллер.в PHP нужно использовать Второй класс контроллера поставщик / laravel / framework/src/подсветка/маршрутизация / контроллер.в PHP. на самом деле ему нужно расширить этот класс, чтобы иметь доступ к его содержимому для обработки некоторых важных функций маршрутизации.

Итак, как класс может расширить другой класс с тем же именем? class Controller extends Controller? это не будет работа, если только нет способа различают эти два класса и там namespace удобна и use ключевое слово помогает завершить миссию, позволяя использовать; (классы, методы, интерфейсы и констант), с тем же именем, в той же области.

теперь, как это делается в коде? очень просто! если мы посмотрим на app / Http / контроллеры / контроллер.в PHP исходный код, мы можете увидеть в верхней части класса пространство имен объявляется как: namespace App\Http\Controllers, Так вот как вы даете своему классу пространство имен, чтобы на него могли ссылаться другие классы теперь это выглядит так же, как путь к этому классу из корневого каталога проекта, с небольшой разницей, и это использование "\" вместо "/" (так же, как командная строка в windows), но есть еще одно отличие, и это приложение с заглавной " A "в пространстве имен по сравнению с" app " с Строчная буква " А " в путь. Также обратите внимание, что пространство имен с учетом регистра.

таким образом, пространство имен является отдельной концепцией, чем путь, он может следовать структуре пути, если это помогает, Но это не должен быть точный путь к класс, метод, интерфейсы или константы например, взгляните на: поставщик / laravel / framework/src/подсветка/маршрутизация / контроллер.в PHP исходный код

мы видим в верхней части класса пространство имен объявляется как: Illuminate\Routing

теперь давайте посмотрим на "use" ключевое слово, мы используем,"use" ключевое слово, чтобы наш класс знал о конкретном классе или функции, которые мы хотим использовать в нашем классе

таким образом, мы не импортируем и не включаем ничего мы просто сообщаем нашему классу, что мы будем использовать определенный класс или метод путем ссылки на них по их пространству имен давайте взглянем на app / Http / контроллеры / контроллер.в PHP исходный код, как видно из строки:"use Illuminate\Routing\Controller as BaseController","use " ключевое слово, за которым следует пространство имен для целевого класса (обратите внимание, что загорается\Routing\Controller.php и осветить\маршрутизацию\контроллер ' без .PHP расширения являются взаимозаменяемыми)

мы можем использовать "as" ключевое слово вместе с"use" ключевое слово, чтобы дать конкретный класс, метод, интерфейсы или константы!--22--> псевдоним, который позволяет app / Http / контроллеры / контроллер.в PHP направить Подсветка\Маршрутизация\Контроллер.в PHP как BaseController в строке: "class Controller extends BaseController".