Что такое пространства имен? - PullRequest
213 голосов
/ 02 августа 2010

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

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

Ответ неспециалиста с примером был бы великолепен.

Ответы [ 9 ]

533 голосов
/ 02 августа 2010

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

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

Сценарий

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

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

Когда вы вызываете output(), как PHP узнает, использовать ли функцию output() или функцию 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();

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

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

18 голосов
/ 02 августа 2010

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

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

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

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

namespace my\namespace;

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

9 голосов
/ 02 августа 2010

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

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

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

4 голосов
/ 10 мая 2018

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

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 02 ноября 2016

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

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

2 голосов
/ 02 августа 2010

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

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

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

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

1 голос
/ 01 марта 2018

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

1 голос
/ 02 августа 2010

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

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

0 голосов
/ 04 ноября 2018

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

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