2012-02-16 14 views
65

Obteniendo este error cuando coloco use Blog; en la parte superior.Solución de problemas "La declaración de uso con nombre no compuesto ... no tiene efecto"

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

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

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

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

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

+0

¿Es esto en un marco? –

+0

no, no estoy usando ningún framework – thelolcat

+0

Me pasó cuando declare mi archivo 'namespace' * después de' 'use Blah;'. –

Respuesta

67

de PHP use no es lo mismo que C++ 's using namespace; le permite definir un alias , no para "importar" un espacio de nombre y, por lo tanto, omitir el calificador del espacio de nombre.

Así, se podría hacer:

use Blog\Article as BA; 

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


En consecuencia, use Blog no sirve para nada, pero creo que se podría escribir:

use \ReallyLongNSName as RLNN; 

Tenga en cuenta que debe utilizar un líder \ aquí para forzar al analizador en ReallyLongNSName sabiendo que es totalmente cualificado. Esto no es cierto para Blog\Article, que es obviamente ya una cadena de espacios de nombres:

Tenga en cuenta que los nombres de espacios de nombres (totalmente cualificado nombres de espacio de nombres que contienen separador de espacio de nombres, tales como Foo\Baren lugar de nombres globales que hacen no, como FooBar), , la barra diagonal inversa inicial no es necesaria y no se recomienda, ya que los nombres de importación deben estar completamente calificados y no se procesan en relación con el espacio de nombres actual.

+10

Ah, eso es una mierda. Entonces el 'uso' es realmente inútil, podría ser un acrónimo :) – thelolcat

+0

@thelolcat: Tiene sus usos ... simplemente no es el que quieres. :) Parece que podría ser una limitación molesta. –

+4

Esta respuesta solo es correcta para archivos sin nombre de usuario. 1) En un archivo de espacio de nombres, no es necesario utilizar una instrucción \ en la instrucción 'use', porque sus argumentos siempre se consideran absolutos (es decir, comenzando desde el espacio de nombres global). 2) 'use Blog;' no es necesariamente inútil: por ejemplo, desde un nombre de archivo llamado 'Blog \ Util \ CLI', le permitiría escribir' Blog \ Entry :: method() 'en 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

4

El use statement in PHP es en realidad sólo una conveniencia para un alias de un largo espacio de nombres 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, eso afecta su desarrollo, además de brindarle comodidad. Dado que, Blog no tiene alias como algo que no está ganando nada de la conveniencia. Me podía imaginar que podría hacer algo como

use \Blog as B;

y que puede incluso trabajar.(Podría argumentarse que en realidad se pierde la conveniencia al oscurecer, pero de eso no se trata la pregunta sobre) Porque en realidad está creando alias el espacio de nombre Blog en otra cosa. Usando Blog\Article obras porque, de acuerdo con los documentos:

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

Así que el fragmento sería equivalente a:

use Blog\Article as Article; 
+0

'use \ Blog as B;' –

+0

Por favor, nunca llame a nada 'B' a menos que esté escribiendo activamente un código que no se puede mantener o que desee causar dolores de cabeza a otros. –

17

Dado que esta cuestión aparece como primer resultado en Google para este error voy a indicar cómo arreglado.

Básicamente, si usted tiene un marco, por ejemplo, como se le Yii2 acostumbrado a tener que hacer declarar clases como:

use Yii; 
use yii\db\WhatEver; 

class AwesomeNewClass extends WhatEver 
{ 
} 

obtendrá este error en Use Yii ya 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 que cosas como esta definan, simplemente elimínela.

+0

¡SÍ! ¡Esto tiene todo el sentido! :) –

+0

Para mí, el problema era que estaba tratando de usar un símbolo del espacio de nombres global, p. Ej. 'use \ Password' pero a php no le gusta cuando intentas hacer eso sin un alias, por lo que incluso' use \ Password as Password' funciona bien. – Kzqai

+0

Downvoted para sugerir el uso de OOD cuando el moderador buscaba una respuesta más general con respecto al uso de espacios de nombres. –

2

El error "La sentencia de uso ... no tiene ningún 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 
} 
1

si no desea utilizar 'como' sintaxis como

use \Blog as B; 

definir un espacio de nombres para el archivo

namespace anyname; 

use Blog 
Cuestiones relacionadas