Recebendo esse erro quando coloco use Blog;
no topo.
Aviso: a instrução de uso com nome não composto 'Blog' não tem efeito em ...
Blog
é o meu namespace no qual tenho 3 classes: Artigo, Lista e Categoria e algumas funções.
Se eu mudar minha declaração para use Blog\Article;
, ela funciona ...
Não posso apenas especificar os namespaces que desejo usar? Eu preciso dar aulas?
E se eu tiver funções dentro desses namespaces? Quando eu os chamo fora do namespace, sou forçado a acrescentar \Blog\
o nome de cada um ...
php
namespaces
Thelolcat
fonte
fonte
namespace
depoisuse Blah;
.Respostas:
PHP
use
não é igual ao C ++using namespace
; ele permite definir um alias , não "importar" um namespace e, portanto, omitir o qualificador de namespace por completo.Então, você pode fazer:
... para encurtá-lo, mas você não pode se livrar dele totalmente.
Conseqüentemente,
use Blog
é inútil, mas acredito que você poderia escrever:Observe que você deve usar um líder
\
aqui para forçar o analisador a saber queReallyLongNSName
é totalmente qualificado. Isso não é verdade paraBlog\Article
, que obviamente já é uma cadeia de namespaces:fonte
use
coisa é realmente inútil, pode muito bem ser um acrônimo para isso :)use
instrução, porque seus argumentos são sempre vistos como absolutos (ou seja, começando do namespace global). 2)use Blog;
não é necessariamente inútil: por exemplo, a partir de um espaço de nomes de arquivo comoBlog\Util\CLI
, permitiria que você escrevesse emBlog\Entry::method()
vez de\Blog\Entry::method()
. Não que isso seja realmente necessário, mas tem um efeito. Para obter um exemplo desse uso, consulte a estrutura Nette.Uma vez que esta questão aparece como o primeiro resultado no Google para este erro, direi como o corrigi.
Basicamente, se você tem um framework, digamos como no Yii2, você estará acostumado a ter que declarar classes como:
Você obterá esse erro
Use Yii
porque esta classe não tem namespace.Como essa classe não tem namespace, ela herda automaticamente a tabela de símbolos global e, portanto, não precisa de coisas como essa definição, apenas remova-a.
fonte
use \Password
mas o php não gosta quando você tenta fazer isso sem um alias, então atéuse \Password as Password
funciona bem.A
use
instrução em PHP é realmente apenas uma conveniência para transformar um namespace longo em algo que pode ser um pouco mais fácil de ler. Na verdade não inclui nenhum arquivo ou faz qualquer outra coisa que afete o seu desenvolvimento, além de proporcionar comodidade. Uma vez que,Blog
não é um apelido como algo que você não está ganhando com a conveniência. Eu poderia imaginar que você poderia fazer algo comouse \Blog as B;
E isso pode até funcionar. ( Pode-se argumentar que você realmente perde a conveniência aqui ao obscurecer, mas não é sobre isso que a questão se trata ) Porque na verdade você está alterando o
Blog
namespace para outra coisa. UsarBlog\Article
funciona porque, de acordo com a documentação:Portanto, seu snippet seria equivalente a:
fonte
B
menos que você esteja escrevendo um código que não pode ser mantido ou que deseje estritamente causar dores de cabeça a outras pessoas.O erro "A instrução de uso ... não tem efeito ..." também aparece se você tentar usar uma característica antes de uma definição de classe.
fonte
se você não quiser usar a sintaxe 'as' como
definir um namespace para o arquivo
fonte