Risoluzione dei problemi "L'istruzione d'uso con nome non composto ... non ha alcun effetto"


95

Ottenere questo errore quando metto use Blog;in alto.

Avvertenza: la dichiarazione di utilizzo con nome non composto "Blog" non ha effetto in ...

Blog è il mio spazio dei nomi in cui ho 3 classi: articolo, elenco e categoria e alcune funzioni.

Se cambio il mio stato di memoria in use Blog\Article;allora funziona ...

Non posso semplicemente specificare gli spazi dei nomi che voglio usare? Devo fornire lezioni?

Cosa succede se ho funzioni all'interno di tali spazi dei nomi? Quando li chiamo fuori dallo spazio dei nomi, sono costretto a anteporre \Blog\al nome di ciascuno ...


no, non sto usando alcun framework
thelolcat

1
Mi è successo quando ho dichiarato il mio file namespace dopo use Blah; .
Derek Illchuk

Può anche significare solo che "Blog" è già stato incluso e che stai cercando di usarlo una seconda volta. Questo è comune se stai usando un framework che lo includeva già più in alto nella catena.
Rhu

@DerekIllchuk se solo questa potesse essere una risposta che potrei votare a favore. Mi ha risparmiato un sacco di mal di testa.
Ci provo così tanto ma piango più forte il

Risposte:


90

PHP usenon è lo stesso di C ++ using namespace; ti permette di definire un alias , non di "importare" uno spazio dei nomi e quindi d'ora in poi omettere del tutto il qualificatore dello spazio dei nomi.

Quindi, potresti fare:

use Blog\Article as BA;

... per accorciarlo, ma non puoi liberartene del tutto.


Di conseguenza use Blogè inutile, ma credo che potresti scrivere:

use \ReallyLongNSName as RLNN;

Nota che devi usare un'interlinea \qui per forzare il parser a sapere che ReallyLongNSNameè pienamente qualificato. Questo non è vero per Blog\Article, che ovviamente è già una catena di spazi dei nomi:

Si noti che per i nomi con spazio dei nomi ( nomi di spazi dei nomi completamente qualificati contenenti separatori dello spazio dei nomi, ad esempio Foo\Bar al contrario di nomi globali che non lo fanno, comeFooBar ), la barra rovesciata iniziale non è necessaria e non è consigliata, poiché i nomi di importazione devono essere completamente qualificati e non vengono elaborati relativo allo spazio dei nomi corrente.


22
Ah che fa schifo. Quindi la usecosa è effettivamente inutile, potrebbe anche essere un acronimo per quello :)
thelolcat

1
@thelolcat: ha i suoi usi ... ma non quello che desideri. :) E non sembra che potrebbe essere una limitazione fastidiosa.
Gare di leggerezza in orbita il

7
Questa risposta è corretta solo per i file senza spazio dei nomi. 1) In un file con spazio dei nomi, non è necessario utilizzare un \ iniziale usenell'istruzione, perché i suoi argomenti sono sempre visti come assoluti (cioè, a partire dallo spazio dei nomi globale). 2) use Blog;non è necessariamente inutile: ad esempio, da un file namespace as Blog\Util\CLI, ti permetterebbe di scrivere Blog\Entry::method()invece di \Blog\Entry::method(). Non che sia davvero necessario, ma ha un effetto. Per un esempio di questo utilizzo, vedere il framework Nette.
Zilk

24

Poiché questa domanda appare come il primo risultato su Google per questo errore, indicherò come l'ho risolto.

Fondamentalmente se hai un framework, diciamo come Yii2 sarai abituato a dover dichiarare classi come:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

Riceverai questo errore Use Yiipoiché questa classe non ha spazio dei nomi.

Poiché questa classe non ha uno spazio dei nomi, eredita automaticamente la tabella dei simboli globale e quindi non ha bisogno di cose come questa definizione, è sufficiente rimuoverla.


SÌ! Questo aveva tutto il senso! :)
Mārtiņš Briedis

1
Per me, il problema era che stavo cercando di utilizzare un simbolo dallo spazio dei nomi globale, ad esempio, use \Passwordma a php non piace quando provi a farlo senza un alias, quindi use \Password as Passwordfunziona anche bene.
Kzqai

Downvoted per aver suggerito l'uso di OOD quando il moderatore cercava una risposta più generale riguardo all'uso degli spazi dei nomi.
Josh Habdas

1
@ JoshH di cosa stai parlando? Non ho nemmeno ricevuto la tua ultima risposta. Sei passato dal dire che non è quello che un moderatore stava cercando per dare il link di qualche ragazzo sul trolling OOP
Sammaye

1
@JoshH (BTW, odio quando le persone fanno riferimento a blog supponenti come quello come materiale autorevole per rispondere a una domanda)
Sammaye

6

L' useistruzione in PHP è in realtà solo una comodità per alias un lungo spazio dei nomi in qualcosa che potrebbe essere un po 'più facile da leggere. In realtà non include alcun file o fa nient'altro che influisca sul tuo sviluppo, oltre a fornire praticità. Dal momento che, Blognon è alias come qualcosa che non stai guadagnando alcuna comodità. Potrei immaginare che potresti fare qualcosa di simile

use \Blog as B;

E potrebbe anche funzionare. ( Si potrebbe sostenere che in realtà si perde la convenienza qui oscurando, ma non è di questo che si tratta ) Perché in realtà stai aliasing lo Blogspazio dei nomi con qualcos'altro. Usare Blog\Articlefunziona perché, secondo la documentazione:

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

Quindi il tuo snippet sarebbe equivalente a:

use Blog\Article as Article;

1
Per favore, non chiamare mai nulla a Bmeno che tu non stia scrivendo attivamente codice non mantenibile o desideri strettamente causare mal di testa ad altri.
Josh Habdas

2

L'errore "L'istruzione use ... non ha effetto ..." viene visualizzato anche se si tenta di utilizzare un tratto prima di una definizione di classe.

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}

2

se non vuoi usare la sintassi "as" come

use \Blog as B;

definire uno spazio dei nomi per il file

namespace anyname;

use Blog
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.