Що таке простори імен?


241

Що таке простори імен PHP?

Що таке простори імен взагалі?

Відповідь неспеціаліста з прикладом була б чудовою.

Відповіді:


573

Розміщення імен робить для функцій та класів те, що область для змінних. Це дозволяє використовувати ту саму функцію або ім’я класу в різних частинах однієї програми, не викликаючи зіткнення імені.

Простіше кажучи, подумайте про простір імен як прізвище людини . Якщо є двоє людей на ім'я "Джон", ви можете використовувати їх прізвища, щоб розказати їх.

Сценарій

Припустимо, ви пишете програму, яка використовує функцію з назвою 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, вам не потрібно буде вимагати або включати файл у файл2. Тестування блоку показало, що це не так.
Аарон Белл

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 повинен використовувати постачальника класу Другий / 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", щоб дати псевдонім конкретного класу, методу, інтерфейсів або констант , який дозволяє додатку / Http / Controllers / Controller.php розширити Illuminate \ Routing \ Controller.php як BaseController у 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: Kau-Boy не сказав, що простори імен в обох мовах були однаковими.
kiamlaluno

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        

Принцип розповсюджується на простір імен у програмуванні слова.


3

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

Нещодавно в PHP була тенденція до величезних класів статичних функцій. Єдиний спосіб викликати будь-яку з цих функцій - це префіксація виклику з назвою класу. Це була примітивна спроба простору імен, але з не дуже великими перевагами.


2

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

Вони корисні під час роботи у великих програмах, щоб запобігти виникненню проблем із фрагментами коду, що має спільне використання.

Наприклад, скажімо, що ми хотіли дві функції під назвою "TheMessage". Вони обидва надрукували (повторюють) різні повідомлення кожен. Зазвичай це може спричинити помилку синтаксису, оскільки у вас не може бути двох функцій, що мають одне і те ж ім’я.

Щоб виправити це, ви можете розмістити ці функції в окремі простори імен. Це дозволить вам використовувати обидві функції без помилок.


2

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


0

Простір імен використовується для укладеної групи кодів, щоб їх можна було використовувати в різних місцях без конфліктів імен. Подумайте про це як про метод конфлікту jQuery, і ви зрозумієте це краще.


Що ви маєте на увазі під "jQuery без конфліктного методу"? Як це пов’язано з PHP?
Ніко Хаас

0

Простір імен - це проста система управління іменами в програмі.
Це гарантує, що імена є унікальними та не призводять до будь-якого конфлікту.


Про які «імена» ви говорите?
Ніко Хааз

0

Ви можете використовувати простір імен, щоб уникнути зіткнень імен між створеним кодом та внутрішніми класами / функціями / константами 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


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