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

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

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

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

12 ответов

Решение

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

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

Сценарий

Предположим, вы пишете приложение, которое использует функцию с именем 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();

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

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

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

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

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

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

namespace my\namespace;

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

Поскольку легче узнать о ключевом слове "использование", зная о "пространстве имен", позвольте мне сначала объяснить пространство имен, рассмотрев базовый проект 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), но есть и другое отличие: приложение с заглавной буквой" А "в пространстве имен и" приложением "с строчными буквами" а "в пути. Также обратите внимание, что пространство имен чувствительно к регистру.

Таким образом, пространство имен - это отдельное понятие, а не путь, оно может следовать структуре пути, если это помогает, но это не обязательно должен быть точный путь к классу, методу, интерфейсам или константам, например, взгляните на: 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 ".

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<?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

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

Нам часто нужно дать ресурсу имя, ярлык, который поможет нам понять, что это такое, и рассказать о нем. Но именование - это не просто задача присвоения последовательности символов. Имена служат для того, чтобы отличать одно от другого.

Даже если идентификатор относится к одному ресурсу, это не означает, что нет двух идентичных идентификаторов.

Мы можем предотвратить или уменьшить конфликты идентификаторов с помощью GUID или добавления информации о пространстве имен . пространство имен - это домен, из которого выбираются имена или идентификаторы . Когда мы добавляем пространство имен к идентификатору, мы создаем квалифицированные имена.

Время для примера!

предположим, что есть только один Джон-Смит с почтовым индексом 99501. Также есть только один Джон-Смит с почтовым индексом 86302. Итак, когда мы упоминаем Джона-Смита, как мы узнаем, о каком Джоне-Смите идет речь?

Когда мы говорим в контексте почтового индекса 99501 и упоминаем Джона-Смита, мы говорим о Джоне-Смите, который уезжает с почтовым индексом 99501.

      <?php
namespace zc99501;

const name = "John-Smith from 99501";
?>

Когда мы говорим в контексте почтового индекса 86302 и упоминаем Джона-Смита, мы говорим о Джоне-Смите, который уезжает с почтовым индексом 86302.

      <?php
namespace zc86302;

const name = "John-Smith from 86302";
?>

Теперь, что произойдет, если один человек с почтовым индексом 99501 и другой человек с почтовым индексом 86302 захотят поговорить о Джоне-Смите. Они должны сказать, что Джон-Смит из 86302 сделал это, а Джон-Смит из 99501 сделал то.

      <?php

namespace zc86302;

const name = "John-Smith from 86302";

namespace zc99501;

const name = "John-Smith from 99501";

echo \zc86302\name . PHP_EOL;
echo \zc99501\name . PHP_EOL;

?>

Здесь, \zc99501\name и \zc86302\name являются квалифицированными именами.

Другой пример.

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

      <?php
namespace Book;

const title = "Don Quixote";
const name = "Miguel de Cervantes Saavedra";
?>

в другом контексте мы подразумеваем под. И по имени.

      <?php
namespace Character;

const title = "Sir";
const name = "Sancho Panza";

?>

Когда мы хотим title и name в обоих контекстах мы должны четко различать Book Title и Title of a Character. Мы также должны четко различать Author Name и Character's Name.

      <?php

namespace Book;

const title = "Don Quixote";
const name = "Miguel de Cervantes Saavedra";

namespace Character;

const title = "Sir";
const name = "Sancho Panza";

echo \Book\title . PHP_EOL;
echo \Book\name . PHP_EOL;
echo \Character\title . PHP_EOL;
echo \Character\name . PHP_EOL;

?>

Здесь, \Book\title, \Book\name, \Character\title и \Character\name являются квалифицированными именами.

Ничего не поделаешь.

Другие вопросы по тегам