Что такое пространства имен PHP?
Что такое пространства имен в целом?
Ответ непрофессионала с примером был бы великолепен.
источник
Что такое пространства имен PHP?
Что такое пространства имен в целом?
Ответ непрофессионала с примером был бы великолепен.
Пространство имен делает для функций и классов то, что делает область видимости для переменных. Это позволяет использовать одну и ту же функцию или имя класса в разных частях одной и той же программы, не вызывая конфликта имен.
Проще говоря, думайте о пространстве имен как о фамилии человека . Если есть два человека по имени «Джон», вы можете использовать их фамилии, чтобы отличить их друг от друга.
Предположим, вы пишете приложение, которое использует функцию с именем 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, используйте что-то вроде этого в верхней части вашего файла.
Вы можете найти гораздо больше информации об официальной документации 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) , но есть другая разница, и это приложение с большой буквы «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
».источник
Есть методы, такие как пространства имен в других языках программирования (например, пакеты в Java). Они используются, чтобы иметь возможность иметь несколько классов с одинаковыми именами в проекте.
Из документации php ( http://www.php.net/manual/en/language.namespaces.rationale.php ):
источник
Пространство имен работает как каталог. Вы знаете, как вы можете поместить файлы в каталог с такими же именами, что и файлы в родительском (или любом другом) каталоге? Ну, пространство имен позволяет вам делать это в приложении для переменных, функций и классов.
Некоторое время назад в PHP была какая-то тенденция к огромным классам статических функций. Единственный способ вызвать любую из этих функций - это поставить префикс перед именем класса. Это была примитивная попытка использования пространств имен, но с небольшими преимуществами.
источник
Как и каталоги и файлы , пространство имен в PHP служит для группировки классов , функций , интерфейсов и констант .
Пример:
Он обеспечивает способ упаковки элементов из глобального пространства и позволяет использовать простое имя элемента, не вызывая конфликта имен в программе. Это поддерживается в PHP 5.3.0, PHP 7.
Но есть некоторые ограничения в аналогии между пространством имен PHP и файловой системой на основе Unix:
Принцип распространяется на пространство имен в программировании.
источник
Пространство имен в основном позволяет помещать код в контейнер. Это предотвратит проблемы с двумя функциями (а также классами и переменными), которые имеют одно и то же имя.
Они полезны при работе с большими приложениями, чтобы предотвратить проблемы с частями кода с одинаковым именем.
Например, допустим, мы хотели две функции под названием «TheMessage». Оба они будут выводить (эхо) разные сообщения каждый. Обычно это вызывает синтаксическую ошибку, поскольку у вас не может быть двух функций с одинаковым именем.
Чтобы это исправить, вы можете поместить эти функции в отдельные пространства имен. Это позволит вам использовать обе функции без каких-либо ошибок.
источник
Пространство имен похоже на упаковку многих вещей в одну упаковку. Представьте себе пространство имен как ящик, в который вы можете положить все виды вещей: карандаш, линейку, лист бумаги и так далее. Чтобы не использовать предметы друг друга, вы решаете пометить ящики, чтобы было ясно, кому что принадлежит.
источник
Пространство имен используется для закрытой группы кодов, чтобы их можно было использовать в разных местах без конфликтов имен. Думайте об этом как о методе jQuery без конфликтов, и вы поймете это лучше.
источник
Пространство имен - это простая система для управления именами в программе.
Это гарантирует, что имена являются уникальными и не приведет к конфликту.
источник
Вы можете использовать пространство имен, чтобы избежать конфликтов имен между создаваемым кодом и внутренними классами / функциями / константами PHP или сторонними классами / функциями / константами. Пространства имен также могут создавать псевдонимы (или сокращать) Extra_Long_Names, предназначенные для уменьшения первой проблемы и улучшения читабельности исходного кода.
Как мы все знаем, пространства имен и особенности не являются новыми в PHP, но все же многие разработчики php не используют эти Великие концепции из-за их сложности. Итак, в этом посте. Я постараюсь прояснить их с помощью примеров. Что такое пространство имен и черты?
Как вы можете реализовать их в своем коде, чтобы сделать ваш код многоразовым и расширяемым?
Преимущества пространств имен
Вы можете использовать пространство имен, чтобы избежать конфликтов имен между создаваемым кодом и внутренними классами / функциями / константами PHP или сторонними классами / функциями / константами.
Пространства имен также могут создавать псевдонимы (или сокращать) Extra_Long_Names, предназначенные для уменьшения первой проблемы и улучшения читабельности исходного кода. Давайте разберем пространства имен на примере. создайте имя папки «php_oops» в htdocs (xampp) или www (xwamp), создайте новую папку в корневом каталоге с именем «namespaces», а затем создайте файл index.php в папке namespaces.
Ссылка- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb
источник