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


241

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

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

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

Ответы:


574

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

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

Сценарий

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

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

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

пример

Как мы решаем, имея две 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();

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

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


По какой-то причине я подумал, что если вы используете пространства имен в file1, вам не нужно будет запрашивать или включать файл в file2. Модульное тестирование показало, что это не так.
Аарон Белл

1
@AaronBell Вы можете проверить автозагрузку .
cbednarski

21

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

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

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

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

namespace my\namespace;

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


11

Поскольку легче узнать о ключевом слове «использование», зная о «пространстве имен», позвольте мне сначала объяснить пространство имен, рассмотрев базовый проект 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» в пространстве имен против «app» с нижним регистром «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 расширять Illuminate \ Routing \ Controller.php в качестве BaseController в строка: « class Controller extends BaseController».


9

Есть методы, такие как пространства имен в других языках программирования (например, пакеты в 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. Этот же принцип распространяется на пространства имен в мире программирования.


1
Сравнение с Java - плохая идея. У Java есть пакеты, и есть классы видимости пакетов. Видимость защищаемых членов также зависит от пакета, который обращается к нему.
Артефакт

1
Они не равны пакетам, но разделяют одну и ту же идею.
2ndkauboy

Поскольку вопрос также задает, что такое пространства имен в целом, ответ имеет смысл.
kiamlaluno

@kiam У них одна идея - не конфликтующие имена классов. Они не разделяют идею видимости.
Артефакт

@Artefacto: Кау-Бой не сказал, что пространства имен на обоих языках были одинаковыми.
kiamlaluno

4

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

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


4

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

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

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

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

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


2

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


0

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


1
Что вы подразумеваете под "jQuery без конфликта метод"? Как это связано с PHP?
Нико

0

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


О каких «именах» вы говорите?
Нико

0

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

Как мы все знаем, пространства имен и особенности не являются новыми в PHP, но все же многие разработчики php не используют эти Великие концепции из-за их сложности. Итак, в этом посте. Я постараюсь прояснить их с помощью примеров. Что такое пространство имен и черты?

Как вы можете реализовать их в своем коде, чтобы сделать ваш код многоразовым и расширяемым?

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

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

Пространства имен также могут создавать псевдонимы (или сокращать) Extra_Long_Names, предназначенные для уменьшения первой проблемы и улучшения читабельности исходного кода. Давайте разберем пространства имен на примере. создайте имя папки «php_oops» в htdocs (xampp) или www (xwamp), создайте новую папку в корневом каталоге с именем «namespaces», а затем создайте файл index.php в папке namespaces.

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

Ссылка- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
Пожалуйста, будьте осторожны со ссылками на свой собственный контент на разных сайтах, вы не хотите быть спамером . Вы должны включить большую часть контента здесь и использовать ссылку только в качестве ссылки.
Дхарман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.