Что такое пространства имен?
Что такое пространство имен 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
Пространство имен - это простая система для управления именами в программе.
Это гарантирует, что имена являются уникальными и не приведет к конфликту.