Czym są przestrzenie nazw?

Czym są przestrzenie nazw PHP?

Czym są przestrzenie nazw w ogóle?

Odpowiedź laika z przykładem byłaby świetna.

Author: alex, 2010-08-02

8 answers

Przestrzeń nazw robi dla funkcji i klas to samo, co scope dla zmiennych. Pozwala na użycie tej samej funkcji lub nazwy klasy w różnych częściach tego samego programu bez powodowania kolizji nazwy.

W prostych słowach, pomyśl o przestrzeni nazw jako o nazwisku osoby. Jeśli są dwie osoby o imieniu "John", możesz użyć ich nazwisk, aby je odróżnić.

Scenariusz

Załóżmy, że piszesz aplikację, która używa funkcji o nazwie output(). Twoje output() funkcja pobiera cały kod HTML na stronie i wysyła go do użytkownika.

Później aplikacja staje się większa i chcesz dodać nowe funkcje. Dodajesz bibliotekę, która pozwala na generowanie kanałów RSS. Biblioteka ta używa również funkcji o nazwie output() do wyświetlania końcowego kanału.

Kiedy wywołujesz output(), skąd PHP wie, czy używać funkcji output() czy funkcji output() biblioteki RSS? Nie ma. chyba że używasz przestrzenie nazw.

Przykład

Jak rozwiązać posiadanie dwóch output() funkcji? Proste. Każda funkcja output() znajduje się we własnej przestrzeni nazw .

To by wyglądało mniej więcej tak:

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

Później, gdy chcemy użyć różnych funkcji, użyjemy:

\MyProject\output();
\RSSLibrary\output();

Lub możemy zadeklarować, że jesteśmy w jednej z przestrzeni nazw, a następnie możemy po prostu wywołać tę przestrzeń nazw output():

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

Brak Przestrzeni Nazw?

Gdybyśmy nie mieli przestrzeni nazw musielibyśmy (potencjalnie) zmieniać dużo kodu za każdym razem, gdy dodaliśmy bibliotekę lub wymyślać żmudne prefiksy, aby nasze nazwy funkcji były unikalne. Dzięki przestrzeniom nazw możemy uniknąć bólu głowy związanego z kolizjami nazw podczas mieszania kodu innych firm z naszymi własnymi projektami.

 448
Author: cbednarski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-02 01:03:46

Przestrzeń nazw pozwala umieścić kilka kodu pod nazwą i nie ma żadnych konfliktów nazewnictwa z klasami, funkcjami i stałymi.

Pozwala twojemu kodowi żyć w tej przestrzeni nazw.

PHP używa nieco kontrowersyjnego znaku \ aby pokazać poziomy przestrzeni nazw. Ludzie wstali w ramiona, ponieważ jest również używany jako charakter ucieczki.

Aby użyć przestrzeni nazw w PHP, użyj czegoś takiego na górze pliku.

namespace my\namespace;

Możesz znaleźć dużo więcej informacji na temat oficjalnej dokumentacji PHP dla przestrzeni nazw.

 12
Author: alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-02 00:08:20

Istnieją techniki takie jak przestrzenie nazw w innych językach programowania (jak pakiety w Javie). Są one używane, aby móc mieć klasy mutliple o tej samej nazwie w projekcie.

Z dokumentacji php (http://www.php.net/manual/en/language.namespaces.rationale.php):

Czym są przestrzenie nazw? W najszerszej definicji przestrzenie nazw są sposobem hermetyzacji elementów. W wielu miejscach można to postrzegać jako pojęcie abstrakcyjne. Na przykład, w każdym działaniu katalogi systemowe służą do grupowania powiązanych plików i działają jako przestrzeń nazw dla plików w nich zawartych. Jako konkretny przykład, plik foo.txt może istnieć zarówno w katalogu / home / greg jak i w /home / other, ale dwie kopie foo.txt nie może współistnieć w tym samym katalogu. Ponadto, aby uzyskać dostęp do foo.plik txt poza katalogiem / home / greg, musimy poprzedzić nazwę katalogu do nazwy pliku używając separatora katalogów, aby uzyskać /home / greg / foo.txt. Ta sama zasada rozciąga się na przestrzenie nazw w świat programowania.

 9
Author: 2ndkauboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-02 00:16:39

Przestrzeń nazw zasadniczo pozwala umieścić kod w kontenerze. Zapobiegnie to problemom z dwiema funkcjami (a także klasami i zmiennymi) o tej samej nazwie.

Są one przydatne podczas pracy przy większych aplikacjach, aby zapobiec problemom z fragmentami kodu o tej samej nazwie.

Na przykład, powiedzmy, że chcieliśmy dwie funkcje o nazwie "TheMessage". Każdy z nich drukuje (echo) różne wiadomości. Zwykle spowoduje to błąd składni, ponieważ nie można mieć dwóch funkcje o tej samej nazwie.

Aby to naprawić, możesz umieścić te funkcje w oddzielnych przestrzeniach nazw. Pozwoli to na korzystanie z obu funkcji bez żadnych błędów.

 2
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-02 00:28:09

Przestrzeń nazw działa jak katalog. Wiesz jak można umieścić pliki w katalogu o takich samych nazwach jak pliki w katalogu nadrzędnym (lub dowolnym innym)? Cóż, przestrzeń nazw pozwala ci to zrobić w aplikacji dla zmiennych, funkcji i klas.

Jakiś czas temu w PHP pojawił się trend dla ogromnych klas funkcji statycznych. Jedynym sposobem na wywołanie którejkolwiek z tych funkcji było prefiks wywołania z nazwą klasy. Była to prymitywna próba tworzenia przestrzeni nazw, ale z niewiele korzyści.

 1
Author: staticsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-02 00:15:19

Podobnie jak katalogi i pliki , przestrzeń nazw w PHP służy do grupowania klas , Funkcje, interfejsy i stałe .

Przykład:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

Zapewnia sposób owijania elementów z przestrzeni globalnej i pozwala na użycie zwykłej nazwy elementu bez powodowania kolizji nazwy w programie. Jest obsługiwany w PHP 5.3.0, PHP 7.

Ale istnieją pewne ograniczenia w analogii między przestrzenią nazw PHP a Uniksem system plików:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

Zasada rozszerza się na Przestrzeń nazw w programie word.

 1
Author: Kossi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-02 06:53:27

Przestrzeń nazw jest jak pakowanie wielu rzeczy w jedną paczkę. Wyobraź sobie przestrzeń nazw jako szufladę, w której możesz umieścić różne rzeczy: ołówek, linijkę, kawałek papieru i tak dalej. Aby uniknąć używania innych przedmiotów, decydujesz się o oznakowaniu szuflad, aby było jasne, co należy do kogo.

 1
Author: Mamun Sabuj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 17:58:44

Ponieważ łatwiej jest poznać słowo kluczowe " use "wiedząc o" przestrzeni nazw", pozwól mi wyjaśnić przestrzeń nazw najpierw patrząc na podstawowy projekt Laravel.

Istnieje klasa kontrolera o nazwie: Controller.php który znajduje się w ścieżce: app / Http / Controllers z katalogu głównego projektu Istnieje również inna klasa kontrolera o nazwie: Controller.php , ale ten jest w ścieżce: vendor/laravel/framework / src/Illuminate/Routing z głównego katalogu projektu

nie musisz jeszcze patrzeć na kod źródłowy, jeśli jesteś nowy w php, ponieważ może cię to mylić, zamiast tego pozwól, że wyjaśnię ci część to, na czym nam zależy i pomoże nam zrozumieć "przestrzeń nazw" i "użyj".

Więc tak naprawdę, nasza pierwsza klasa kontrolerów: app / Http / Controllers / Controller.php musi korzystać z Drugi Klasa kontrolera vendor/laravel/framework / src/Illuminate/Routing / Controller.php. w rzeczywistości musi rozszerzyć tę klasę, aby mieć dostęp do jej zawartości w celu obsługi niektórych kluczowych funkcji routingu.

Jak więc klasa może rozszerzyć inną klasę o tej samej nazwie? class Controller extends Controller? to nie zadziała, chyba, że istnieje sposób na rozróżnienie tych dwóch klas i tam namespace przydaje się słowo kluczowe use pomaga aby wypełnić misję, pozwalając na użycie; (klasy; metody; interfejsy i stałe), o tej samej nazwie, w tym samym zakresie.

Jak to jest zrobione w kodzie? bardzo proste! jeśli spojrzymy na app / Http / Controllers / Controller.php kod źródłowy, możemy zobaczyć na szczycie klasy przestrzeń nazw jest zadeklarowana jako: namespace App\Http\Controllers, więc w ten sposób nadajesz swojej klasie przestrzeń nazw, aby mogła być odwoływana przez inne klasy teraz wygląda to tak samo jak ścieżka do tej klasy z katalogu głównego projektu, z niewielką różnicą i to jest użycie "\ "zamiast" /" (to samo co wiersz polecenia w systemie windows) , ale jest inna różnica i to jest aplikacja z wielką literą " A "w przestrzeni nazw kontra "aplikacja" z Małe litery " a " w ścieżce. zauważ również, że przestrzeń nazw uwzględnia wielkość liter.

Tak więc przestrzeń nazw jest osobną koncepcją niż ścieżka, może podążać za strukturą ścieżki, jeśli to pomaga, ale to nie musi być dokładna droga do klasy, metody, interfejsy lub stałe na przykład spójrz na: vendor/laravel/framework / src/Illuminate/Routing / Controller.php kod źródłowy,

Widzimy na górze klasy przestrzeń nazw jest zadeklarowana jako: Illuminate\Routing

Spójrzmy teraz na słowo kluczowe " use", używamy słowa kluczowego " use", aby uświadomić naszej klasie konkretną klasę lub funkcję, której chcemy użyć w naszej klasie

Więc nie jesteśmy importując lub dołączając cokolwiek informujemy naszą klasę, że będziemy używać określonej klasy lub metoda poprzez odwoływanie się do nich za pomocą ich przestrzeni nazw przyjrzyjmy się app / Http / Controllers / Controller.php kod źródłowy, jak widać z linii: "use Illuminate\Routing\Controller as BaseController", słowo kluczowe " use", po którym następuje przestrzeń nazw dla klasy docelowej (zauważ, że Illuminate\Routing \ Controller.php i Illuminate\Routing \ Controller ' bez .PHP extension " are wymienne)

Możemy użyć słowa kluczowego "as "wraz ze słowem kluczowym" use", aby dać specyficzną klasę, metodę, interfejsy lub stałe alias, który pozwala app / Http / Controllers / Controller.php aby rozszerzyć Illuminate\Routing \ Controller.php jako BaseController w linii: "class Controller extends BaseController".

 0
Author: Bahman.A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 23:14:48