Mam plik z klasą Resp
. Ścieżka to:
C:\xampp\htdocs\One\Classes\Resp.php
Mam index.php
plik w tym katalogu:
C:\xampp\htdocs\Two\Http\index.php
W tym index.php
pliku chcę utworzyć instancję klasy Resp
.
$a = new Resp();
Wiem, że mogę użyć słów kluczowych require
lub, include
aby dołączyć plik do klasy:
require("One\Classes\Resp.php"); // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();
Ale chcę zaimportować klasy bez użycia require
lub include
. Próbuję zrozumieć, jak use
działa słowo kluczowe. Wypróbowałem te kroki, ale nic nie działa:
use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes; /* nothing works */
$a = new Resp();
To mówi:
Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php
Jak działa słowo kluczowe use
? Czy mogę go używać do importowania klas?
namespace
s. W rzeczywistości nie ma żadnej Symfony, jeśli nie używasz przestrzeni nazwOdpowiedzi:
use
nie zawiera niczego. Po prostu importuje określoną przestrzeń nazw (lub klasę) do bieżącego zakresuJeśli chcesz, aby klasy były ładowane automatycznie - przeczytaj o automatycznym ładowaniu
źródło
Nie, nie możesz zaimportować zajęć ze
use
słowem kluczowym. Musisz użyćinclude
/require
oświadczenie. Nawet jeśli używasz auto ładowarka PHP, nadal autoloader będzie musiał użyć jednejinclude
lubrequire
wewnętrznie.Słowo kluczowe Cel użycia :
Rozważmy przypadek, w którym masz dwie klasy o tej samej nazwie; wyda się to dziwne, ale zdarza się, gdy pracujesz z dużą strukturą MVC. Więc jeśli masz dwie klasy o tej samej nazwie, umieść je w różnych przestrzeniach nazw. Zastanów się teraz, kiedy twój automatyczny program ładujący ładuje obie klasy (robi przez
require
) i masz zamiar użyć obiektu klasy. W takim przypadku kompilator pomyli się, który obiekt klasy załadować spośród dwóch. Aby pomóc kompilatorowi w podjęciu decyzji, możesz użyćuse
instrukcji, aby mógł podjąć decyzję, na której z nich zostanie użyty.Obecnie główne frameworki używają
include
lubrequire
za pośrednictwemcomposer
ipsr
1) kompozytor
2) autoloader PSR-4
Przejrzenie ich może pomóc ci dalej. Możesz również użyć aliasu, aby zaadresować dokładną klasę. Załóżmy, że masz dwie klasy o tej samej nazwie, powiedzmy
Mailer
z dwiema różnymi przestrzeniami nazw:i
A jeśli chcesz używać obu klas Mailer w tym samym czasie, możesz użyć aliasu.
W dalszej części kodu, jeśli chcesz uzyskać dostęp do tych obiektów klas, możesz wykonać następujące czynności:
Będzie odnosić się do oryginalnej klasy.
Niektórzy mogą się pomylić, że w takim razie nie ma podobnych nazw klas, to nie ma zastosowania
use
słowa kluczowego. Cóż, możesz użyć__autoload($class)
funkcji, która zostanie wywołana automatycznie, gdyuse
instrukcja zostanie wykonana z klasą, która ma być użyta jako argument, a to może pomóc ci załadować klasę w czasie wykonywania w locie, gdy zajdzie taka potrzeba.Zapoznaj się z tą odpowiedzią, aby dowiedzieć się więcej o autoloaderze klas.
źródło
use
instrukcja way powie kompilatorowi załaduj to teraz. Mam to kochanie!Nie zastanawiaj się zbytnio, czym jest przestrzeń nazw .
Przestrzeń nazw jest po prostu prefiksem klasy (jak katalog w systemie operacyjnym), aby zapewnić niepowtarzalność ścieżki klasy .
Również dla jasności, instrukcja use nie robi nic tylko aliasowania twoich przestrzeni nazw, dzięki czemu można używać skrótów lub dołączać klasy o tej samej nazwie, ale o różnych przestrzeniach nazw w tym samym pliku.
Na przykład:
Jeśli chcesz wiedzieć, jak działają przestrzenie nazw PHP i automatyczne ładowanie (stary i nowy sposób z Composerem), możesz przeczytać wpis na blogu, który właśnie napisałem na ten temat: https://enterprise-level-php.com/ 2017/12/25 / the-magic-behind-autoloading-files-using-composer.html
źródło
I tak będziesz musiał dołączyć / wymagać klasy, w przeciwnym razie PHP nie będzie wiedziało o przestrzeni nazw.
Nie musisz jednak robić tego w tym samym pliku. Możesz to zrobić na przykład w pliku bootstrap. (lub użyj autoloadera, ale nie o to właściwie chodzi)
źródło
Najprawdopodobniej będziesz musiał użyć automatycznego programu ładującego, który przyjmie nazwę klasy (w tym przypadku podziel na '\') i zamapuje ją na strukturę katalogów.
Możesz zapoznać się z tym artykułem na temat funkcji automatycznego ładowania w PHP. Istnieje już wiele implementacji tego typu funkcjonalności w frameworkach.
Właściwie to wdrożyłem już wcześniej. Oto link .
źródło
Zgadzam się z Greenem, Symfony potrzebuje przestrzeni nazw, więc dlaczego ich nie użyć?
Tak zaczyna się przykładowa klasa kontrolera:
źródło
Nie możesz tego zrobić w ten sposób poza powyższymi przykładami. Możesz również użyć słowa kluczowego
use
wewnątrz klas, aby zaimportować cechy , na przykład:źródło
Słowo
use
kluczowe służy do tworzenia aliasów w PHP i nie importuje klas. To naprawdę pomaga1) Gdy masz klasy o tej samej nazwie w różnych przestrzeniach nazw
2) Unikaj ciągłego używania naprawdę długich nazw klas.
źródło
Przestrzeń nazw służy do zdefiniowania ścieżki do konkretnego pliku zawierającego klasę np
Następnie możesz dołączyć tę konkretną klasę do innego pliku php, używając słowa kluczowego „użyj” w następujący sposób:
UWAGA: Nie używaj ścieżki do pliku zawierającego klasę, która ma być implementowana, rozszerza użycie do utworzenia instancji obiektu, ale użyj tylko przestrzeni nazw.
źródło
Użycie słowa kluczowego „use” służy do skracania literałów przestrzeni nazw. Możesz używać zarówno z aliasowaniem, jak i bez niego. Bez aliasingu musisz użyć ostatniej części pełnej przestrzeni nazw.
źródło