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

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

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

Ответ Layman с примером будет замечательным.

Ответы

Ответ 1

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

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

Сценарий

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

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

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

Пример

Как мы решаем наличие двух функций output()? Просто. Мы придерживаемся каждой функции output() в своем собственном namespace.

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

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

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

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

Ответ 2

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

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

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

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

namespace my\namespace;

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

Ответ 3

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

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

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

Ответ 4

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

Существует класс контроллера с именем: Controller.php, который находится в пути: app/Http/Controllers из корневого каталога проектов Существует также другой класс контроллера с именем: Controller.php, но этот находится в пути: vendor/laravel/framework/src/Illuminate/Routing из корневого каталога проектов

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

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

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

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

Таким образом, пространство имен - это отдельное понятие, а не путь, оно может следовать структуре пути, если это помогает, но оно не должно быть точным путем к Класс, метод, интерфейсы или константы, например, взглянуть на: vendor/laravel/framework/src/Illuminate/Routing/Controller.php,

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

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

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

мы можем использовать ключевое слово "as" вместе с ключевым словом "use", чтобы дать конкретному классу, методу, интерфейсам или константам псевдоним, который позволяет app/Http/Controllers/Controller.php для расширения подсветки\Routing\Controller.php в виде BaseController в строке: 'class Controller extends BaseController.

Ответ 5

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

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

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

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

Ответ 6

Во многом как каталоги и файлы, пространство имен в 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        

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

Пространство имен - это простая система для управления именами в программе.
Это гарантирует, что имена являются уникальными и не приведет к конфликту.