Solución de problemas "La declaración de uso con nombre no compuesto ... no tiene ningún efecto"

95

Recibiendo este error cuando pongo use Blog;en la parte superior.

Advertencia: La declaración de uso con el nombre no compuesto 'Blog' no tiene efecto en ...

Blog es mi espacio de nombres en el que tengo 3 clases: Artículo, Lista y Categoría y algunas funciones.

Si cambio mi statememnt a use Blog\Article;entonces funciona ...

¿No puedo especificar los espacios de nombres que quiero usar? ¿Necesito dar clases?

¿Qué pasa si tengo funciones dentro de esos espacios de nombres? Cuando los llamo fuera del espacio de nombres, me veo obligado a anteponer \Blog\el nombre de cada uno ...

thelolcat
fuente
no, no estoy usando ningún marco
thelolcat
1
Me pasó cuando declaré mi archivo namespace después use Blah; .
Derek Illchuk
También puede significar que ya se ha incluido 'Blog' y que está intentando utilizarlo por segunda vez. Esto es común si está utilizando un marco que ya lo incluyó más arriba en la cadena.
Rhu
@DerekIllchuk si solo esta pudiera ser una respuesta que pudiera votar. Me ahorró mucho dolor de cabeza.
Me esfuerzo mucho pero lloro más fuerte

Respuestas:

90

PHP useno es lo mismo que C ++ using namespace; le permite definir un alias , no "importar" un espacio de nombres y por lo tanto omitir el calificador del espacio de nombres por completo.

Entonces, podrías hacer:

use Blog\Article as BA;

... para acortarlo, pero no puede deshacerse de él por completo.


En consecuencia, use Bloges inútil, pero creo que podrías escribir:

use \ReallyLongNSName as RLNN;

Tenga en cuenta que debe utilizar un encabezado \aquí para obligar al analizador a saber que ReallyLongNSNameestá totalmente calificado. Esto no es cierto para Blog\Article, que obviamente ya es una cadena de espacios de nombres:

Tenga en cuenta que para los nombres con espacios de nombres ( nombres de espacios de nombres totalmente calificados que contienen un separador de espacios de nombres, Foo\Bar como a diferencia de los nombres globales que no lo tienen, comoFooBar ), la barra invertida inicial es innecesaria y no se recomienda, ya que los nombres de importación deben estar completamente calificados y no se procesan relativo al espacio de nombres actual.

Carreras de ligereza en órbita
fuente
22
Ah, eso apesta. Así que la usecosa es realmente inútil, bien podría ser un acrónimo para eso :)
thelolcat
1
@thelolcat: Tiene sus usos ... pero no el que tú quieres. :) que no parece como que podría ser una limitación molesta.
Lightness Races in Orbit
7
Esta respuesta solo es correcta para archivos sin espacio de nombres. 1) En un archivo con espacio de nombres, no es necesario utilizar un \ al useprincipio de la declaración, porque sus argumentos siempre se ven como absolutos (es decir, comenzando desde el espacio de nombres global). 2) use Blog;no es necesariamente inútil: por ejemplo, a partir de un archivo con espacio de nombres como Blog\Util\CLI, le permitiría escribir en Blog\Entry::method()lugar de \Blog\Entry::method(). No es que esto sea realmente necesario, pero tiene un efecto. Para ver un ejemplo de este uso, consulte el marco de Nette.
Zilk
24

Dado que esta pregunta aparece como el primer resultado en Google para este error, diré cómo lo solucioné.

Básicamente, si tiene un marco, digamos como Yii2, estará acostumbrado a tener que declarar clases como:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

Obtendrá este error Use Yiiya que esta clase no tiene espacio de nombres.

Dado que esta clase no tiene espacio de nombres, hereda automáticamente la tabla de símbolos global y, por lo tanto, no necesita definir cosas como esta, simplemente elimínela.

Sammaye
fuente
¡SI! ¡Esto tenía todo el sentido! :)
Mārtiņš Briedis
1
Para mí, el problema era que estaba tratando de usar un símbolo del espacio de nombres global, por ejemplo, use \Passwordpero a php no le gusta cuando intentas hacerlo sin un alias, así que incluso use \Password as Passwordfunciona bien.
Kzqai
Se votó en contra por sugerir el uso de OOD cuando el moderador buscaba una respuesta más general con respecto al uso de espacios de nombres.
Josh Habdas
1
@JoshH, ¿de qué estás hablando? Ni siquiera recibo tu última respuesta. Has pasado de decir que no es lo que un moderador estaba buscando a dar el enlace de algún tipo sobre el trolling OOP
Sammaye
1
@JoshH (Por cierto, odio cuando la gente hace referencia a blogs con opiniones como ese como material autorizado para responder una pregunta)
Sammaye
6

La usedeclaración en PHP es realmente una conveniencia para alias de un espacio de nombres largo en algo que puede ser un poco más fácil de leer. En realidad, no incluye ningún archivo ni hace nada más que afecte su desarrollo, además de brindar comodidad. Dado que, Blogno tiene un alias como algo, no está obteniendo ninguna ventaja. Podría imaginar que podrías hacer algo como

use \Blog as B;

Y eso incluso puede funcionar. ( Se podría argumentar que en realidad pierde la conveniencia aquí al oscurecer, pero de eso no se trata la pregunta ) Porque en realidad está alias del Blogespacio de nombres con otra cosa. Usar Blog\Articlefunciona porque, según los documentos:

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

Entonces su fragmento sería equivalente a:

use Blog\Article as Article;
Charles Sprayberry
fuente
1
Por favor, nunca llames a nada a Bmenos que estés escribiendo un código que no se pueda mantener o que desees estrictamente causar dolores de cabeza a otros.
Josh Habdas
2

El error "La declaración de uso ... no tiene efecto ..." también aparece si intenta usar un rasgo antes de una definición de clase.

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}
Dieter Donnert
fuente
2

si no quiere usar la sintaxis 'as' como

use \Blog as B;

definir un espacio de nombres para el archivo

namespace anyname;

use Blog
samehanwar
fuente