Co to są przestrzenie nazw PHP?
Jakie są ogólnie przestrzenie nazw?
Odpowiedź Laika z przykładem byłaby świetna.
źródło
Co to są przestrzenie nazw PHP?
Jakie są ogólnie przestrzenie nazw?
Odpowiedź Laika z przykładem byłaby świetna.
Przestrzeń nazw działa dla funkcji i klas co zakres dla zmiennych. Pozwala na użycie tej samej funkcji lub nazwy klasy w różnych częściach tego samego programu bez powodowania kolizji nazw.
Mówiąc prościej, pomyśl o przestrzeni nazwisk jako nazwisku osoby . Jeśli są dwie osoby o imieniu „John”, możesz użyć ich nazwisk, aby je rozróżnić.
Załóżmy, że piszesz aplikację korzystającą z funkcji o nazwie output()
. Twoja output()
funkcja pobiera cały kod HTML z twojej strony i wysyła go do użytkownika.
Później Twoja aplikacja staje się większa i chcesz dodać nowe funkcje. Dodajesz bibliotekę, która pozwala generować kanały RSS. Ta biblioteka korzysta również z funkcji o nazwie output()
wyjściowej kanału końcowego.
Kiedy dzwonisz output()
, skąd PHP wie, czy użyć twojej output()
funkcji, czy funkcji biblioteki RSS output()
? Tak nie jest. Chyba że używasz przestrzeni nazw.
Jak rozwiązać dwie output()
funkcje? Prosty. Trzymamy każdą output()
funkcję 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 korzystać z różnych funkcji, używamy:
\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();
Gdybyśmy nie mieli przestrzeni nazw, musielibyśmy (potencjalnie) zmienić dużo kodu za każdym razem, gdy dodawaliśmy bibliotekę, lub wymyślaliśmy nużące prefiksy, aby nasze nazwy funkcji były unikalne. Dzięki przestrzeniom nazw możemy uniknąć problemów związanych z kolizjami nazw podczas mieszania kodu innej firmy z naszymi własnymi projektami.
Przestrzeń nazw pozwala na umieszczenie wiązki kodu pod nazwą i unikanie konfliktów nazw z klasami, funkcjami i stałymi.
Pozwala to żyć kodowi w tej przestrzeni nazw.
PHP wykorzystuje nieco kontrowersyjny znak
\
do wyświetlania poziomów przestrzeni nazw. Ludzie wstali w ramiona, ponieważ jest również używany jako postać ucieczki.Aby użyć przestrzeni nazw w PHP, użyj czegoś takiego na górze pliku.
Możesz znaleźć o wiele więcej informacji na temat oficjalnej dokumentacji PHP dla przestrzeni nazw .
źródło
Ponieważ łatwiej jest poznać słowo kluczowe „use”, wiedząc o „przestrzeni nazw”, pozwól mi najpierw wyjaśnić przestrzeń nazw, patrząc na podstawowy projekt Laravel.
Istnieje ścieżka kontrolera o nazwie: Controller.php, która znajduje się na ścieżce: app / Http / Controllers z katalogu głównego projektu. Istnieje również inna klasa kontrolera o nazwie: Controller.php , ale ta znajduje się na ścieżce: vendor / laravel / framework / src / Illuminate / Routing z katalogu głównego projektu
Nie musisz jeszcze patrzeć na kod źródłowy, jeśli dopiero zaczynasz korzystać z php, ponieważ może Cię on pomylić, zamiast tego pozwól, że wyjaśnię ci tę część, na której nam zależy, i pomoże nam zrozumieć „przestrzeń nazw” i „używać” ”.
W rzeczywistości nasza pierwsza klasa kontrolera: app / Http / Controllers / Controller.php musi korzystać z dostawcy drugiej klasy kontrolera / laravel / framework / src / Illuminate / Routing / Controller.php . w rzeczywistości musi rozszerzyć tę klasę, aby mieć dostęp do jej zawartości do 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 tamnamespace
przydaje się, ause
słowo kluczowe pomaga wypełnić misję, umożliwiając użycie; (klasy; metody; interfejsy i stałe), o tej samej nazwie, w tym samym zakresie.jak to się dzieje w kodzie? bardzo prosty! jeśli spojrzymy nakod źródłowy app / Http / Controllers / Controller.php , możemy zobaczyć, że u góry obszaru nazw klasy jest zadeklarowany jako:,
namespace App\Http\Controllers
więc w ten sposób nadajesz swojej klasie przestrzeń nazw, aby mogła się do niej odwoływać inne klasy teraz wygląda to tak samo jak ścieżka do tej klasy z katalogu głównego projektu, z niewielką różnicą, a to użycie „\
” zamiast „/
” (to samo co wiersz poleceń w Windows) , ale jest inna różnica i jest to aplikacja z kapitałem „A” w przestrzeni nazw kontra „aplikacja” z małymi literami „a” na ścieżce. Pamiętaj też, że w przestrzeni nazw rozróżniana jest wielkość liter.Przestrzeń nazw jest więc odrębną koncepcją niż ścieżka, może podążać za strukturą ścieżki, jeśli to pomaga, ale nie musi to być dokładna ścieżka do klasy, metody, interfejsów lub stałych, na przykład spójrz na: vendor / laravel / framework /src/Illuminate/Routing/Controller.php kod źródłowy,
widzimy na górze klasy, że przestrzeń nazw jest zadeklarowana jako:
Illuminate\Routing
teraz spójrzmy na
use
słowo kluczowe „ ”, którego używamy,use
słowo kluczowe „ ”, aby uświadomić naszej klasie konkretną klasę lub funkcję, której chcemy użyć w naszej klasiewięc nie importujemy ani nie włączamy niczego , po prostu informujemy naszą klasę, że będziemy używać konkretnej klasy lub metody, odwołując się do ich przestrzeni nazw, spójrzmy na kod źródłowy app / Http / Controllers / Controller.php , jak widać z wiersza: „
use Illuminate\Routing\Controller as BaseController
”,use
słowo kluczowe „ ”, po którym następuje przestrzeń nazw dla klasy docelowej (zwróć uwagę, że Illuminate \ Routing \ Controller.php i Illuminate \ Routing \ Controller „bez rozszerzenia .php” są wymienne)możemy użyć
as
słowa kluczowego „ ” wraz ze słowem kluczowym „use
”, aby nadać określonej klasie, metodzie, interfejsom lub stałym alias, który pozwala app / Http / Controllers / Controller.php rozszerzyć Illuminate \ Routing \ Controller.php jako BaseController w wiersz: „class Controller extends BaseController
”.źródło
Istnieją techniki takie jak przestrzenie nazw w innych językach programowania (np. Pakiety w Javie). Służą do tego, aby mieć w projekcie wiele klas o tej samej nazwie.
Z dokumentacji php ( http://www.php.net/manual/en/language.namespaces.rationale.php ):
źródło
Podobnie jak katalogi i pliki , przestrzeń nazw w PHP służy do grupowania klas , funkcji , interfejsów i stałych .
Przykład:
Zapewnia sposób owijania elementów z globalnej przestrzeni i pozwala na użycie zwykłej nazwy elementu bez powodowania kolizji nazw w programie. Jest obsługiwany w PHP 5.3.0, PHP 7.
Istnieją jednak pewne ograniczenia w analogii między przestrzenią nazw PHP a systemem plików opartym na Uniksie:
Zasada obejmuje przestrzeń nazw w słowie programowym.
źródło
Przestrzeń nazw działa jak katalog. Wiesz, jak umieścić pliki w katalogu o takich samych nazwach, jak pliki w katalogu nadrzędnym (lub innym)? Przestrzeń nazw pozwala to zrobić w aplikacji dla zmiennych, funkcji i klas.
Jakiś czas temu w PHP pojawił się pewien trend dla ogromnych klas funkcji statycznych. Jedynym sposobem wywołania którejkolwiek z tych funkcji było poprzedzenie wywołania nazwą klasy. Była to prymitywna próba przestrzeni nazw, ale nie przyniosła wiele korzyści.
źródło
Przestrzeń nazw pozwala zasadniczo 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, gdy większe aplikacje zapobiegają problemom z fragmentami kodu o tej samej nazwie.
Załóżmy na przykład, że chcieliśmy dwóch funkcji o nazwie „TheMessage”. Obie drukowałyby (echo) różne wiadomości. Zwykle spowodowałoby to błąd składniowy, ponieważ nie można mieć dwóch funkcji o tej samej nazwie.
Aby to naprawić, możesz umieścić te funkcje w osobnych przestrzeniach nazw. Umożliwiłoby to korzystanie z obu funkcji bez żadnych błędów.
źródło
Przestrzeń nazw przypomina 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ę, kartkę papieru i tak dalej. Aby uniknąć wzajemnego używania przedmiotów, decydujesz się na etykietowanie szuflad, aby było jasne, do kogo należy.
źródło
Przestrzeń nazw służy do zamykania grupy kodów, dzięki czemu można ich używać w różnych miejscach bez konfliktów nazw. Pomyśl o tym jako o metodzie jQuery bez konfliktu, a zrozumiesz to lepiej.
źródło
Przestrzeń nazw to prosty system do kontrolowania nazw w programie.
Zapewnia to, że nazwy są unikalne i nie doprowadzą do żadnego konfliktu.
źródło
Możesz użyć przestrzeni nazw, aby uniknąć kolizji nazw między tworzonym kodem a wewnętrznymi klasami / funkcjami / stałymi PHP lub klasami / funkcjami / stałymi innych firm. Przestrzenie nazw mają również możliwość aliasu (lub skrócenia) Extra_Long_Names zaprojektowanego w celu zmniejszenia pierwszego problemu, poprawiając czytelność kodu źródłowego.
Jak wszyscy wiemy, przestrzenie nazw i cechy nie są nowe w PHP, ale wciąż wielu programistów php nie używa tych wielkich pojęć ze względu na ich złożoność. Więc w tym poście. Spróbuję je wyczyścić przykładami. Co to jest przestrzeń nazw i cechy?
Jak możesz zaimplementować je w kodzie, aby kod był wielokrotnego użytku i rozszerzalny?
Korzyści z przestrzeni nazw
Możesz użyć przestrzeni nazw, aby uniknąć kolizji nazw między tworzonym kodem a wewnętrznymi klasami / funkcjami / stałymi PHP lub klasami / funkcjami / stałymi innych firm.
Przestrzenie nazw mają również możliwość aliasu (lub skrócenia) Extra_Long_Names zaprojektowanego w celu zmniejszenia pierwszego problemu, poprawiając czytelność kodu źródłowego. Rozumiem przestrzenie nazw na przykładzie. utwórz nazwę folderu „php_oops” w htdocs (xampp) lub www (xwamp) utwórz nowy folder w katalogu głównym o nazwie „przestrzenie nazw”, a następnie utwórz plik index.php w folderze przestrzeni nazw.
Odniesienie- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb
źródło