Otrzymuję ten błąd, gdy umieszczam use Blog;
na górze.
Ostrzeżenie: instrukcja użycia z nazwą niezłożoną „Blog” nie ma wpływu na ...
Blog
to moja przestrzeń nazw, w której mam 3 klasy: Artykuł, Lista i Kategoria oraz kilka funkcji.
Jeśli zmienię swój status na, use Blog\Article;
to działa ...
Czy nie mogę po prostu określić przestrzeni nazw, których chcę używać? Czy muszę organizować zajęcia?
A jeśli mam funkcje w tych przestrzeniach nazw? Kiedy dzwonię do nich poza przestrzenią nazw, jestem zmuszony do dodawania \Blog\
każdego imienia ...
php
namespaces
thelolcat
źródło
źródło
namespace
pouse Blah;
.Odpowiedzi:
PHP
use
to nie to samo co C ++using namespace
; pozwala na zdefiniowanie aliasu , a nie na "importowanie" przestrzeni nazw i tym samym całkowite pominięcie kwalifikatora przestrzeni nazw.Więc możesz zrobić:
use Blog\Article as BA;
... aby go skrócić, ale nie można się go całkowicie pozbyć.
W konsekwencji
use Blog
jest bezużyteczna, ale myślę, że można by napisać:use \ReallyLongNSName as RLNN;
Zauważ, że musisz użyć wiodącego
\
tutaj, aby zmusić parser do stwierdzenia, żeReallyLongNSName
jest w pełni kwalifikowany. To nie jest prawdą w przypadkuBlog\Article
, co oczywiście jest już łańcuchem przestrzeni nazw:źródło
use
rzecz jest właściwie bezużyteczna, równie dobrze może być akronimem na to :)use
początkowego znaku \ w instrukcji, ponieważ jego argumenty są zawsze postrzegane jako bezwzględne (tj. Począwszy od globalnej przestrzeni nazw). 2)use Blog;
niekoniecznie jest bezużyteczne: na przykład z pliku o przestrzeni nazw asBlog\Util\CLI
, umożliwiłoby to pisanieBlog\Entry::method()
zamiast\Blog\Entry::method()
. Nie żeby to było naprawdę konieczne, ale ma wpływ. Aby zapoznać się z przykładem tego użycia, zobacz platformę Nette.Ponieważ to pytanie pojawia się jako pierwszy wynik tego błędu w Google, podam, jak go naprawiłem.
Zasadniczo, jeśli masz framework, powiedzmy jak Yii2, przyzwyczaisz się do deklarowania klas takich jak:
use Yii; use yii\db\WhatEver; class AwesomeNewClass extends WhatEver { }
Ten błąd zostanie wyświetlony,
Use Yii
ponieważ ta klasa nie ma przestrzeni nazw.Ponieważ ta klasa nie ma przestrzeni nazw, automatycznie dziedziczy globalną tablicę symboli, a więc nie potrzebuje takich rzeczy, jak to definiowanie, po prostu ją usuń.
źródło
use \Password
Php nie lubi tego, gdy próbujesz to zrobić bez aliasu, więc nawetuse \Password as Password
działa dobrze.use
Oświadczenie w PHP jest naprawdę tylko wygoda alias długa nazw w coś, co może być nieco łatwiejsze do odczytania. W rzeczywistości nie zawiera żadnych plików ani niczego innego, co wpływa na twój rozwój, poza wygodą. PonieważBlog
nie jest aliasowany jako coś, czego nie zyskujesz żadnej z wygody. Mogę sobie wyobrazić, że możesz zrobić coś takiegouse \Blog as B;
I to może nawet zadziałać. ( Można by argumentować, że w rzeczywistości tracisz wygodę przez zaciemnianie, ale nie o to chodzi ) Ponieważ tak naprawdę aliasujesz
Blog
przestrzeń nazw na coś innego. UżywanieBlog\Article
działa, ponieważ zgodnie z dokumentacją:// this is the same as use My\Full\NSname as NSname use My\Full\NSname;
Twój fragment byłby więc odpowiednikiem:
use Blog\Article as Article;
źródło
B
chyba że aktywnie piszesz kod nie do utrzymania lub ściśle chcesz sprawiać innym ból głowy.Jeśli spróbujesz użyć cechy przed definicją klasy, pojawi się również błąd „Instrukcja use ... nie ma wpływu ...”.
use My_trait; // should not be here class My_class{ // use My_trait; should be here instead }
źródło
jeśli nie chcesz używać składni „as”, takiej jak
use \Blog as B;
zdefiniuj przestrzeń nazw dla pliku
namespace anyname; use Blog
źródło