Dépannage de “La déclaration d'utilisation avec des non-nom composé ... n'a pas d'effet”
Obtenez cette erreur lorsque j'ai mis use Blog;
en haut.
Avertissement: L'utilisation déclaration de non-composé du nom de "Blog" n'a aucun effet
dans...
Blog
est mon espace de noms dans lequel j'ai 3 catégories: Article de la Liste et de la Catégorie et de quelques fonctions.
Si je change mon statememnt à use Blog\Article;
puis il travaille...
Je ne peux pas juste spécifier les espaces de noms que je veux utiliser? Dois-je fournir des classes?
Que faire si j'ai des fonctions à l'intérieur que les espaces de noms? Quand je les appelle à l'extérieur de l'espace de noms, je suis obligé de la faire précéder de \Blog\
à son nom...
- Est-ce dans un cadre?
- non, je n'utilise pas de framework
- Qui m'est arrivé lorsque j'ai déclaré mon fichier
namespace
aprèsuse Blah;
. - Il peut aussi tout simplement dire que "Blog" a déjà été inclus déjà et que vous essayez de l'utiliser une deuxième fois. Ce qui est commun si vous utilisez un cadre de travail qui comprenait déjà plus haut de la chaîne.
Vous devez vous connecter pour publier un commentaire.
PHP
use
n'est pas le même que le C++using namespace
; il vous permet de définir un alias, de ne pas "importer" un espace de noms, et donc désormais omettre le qualificateur d'espace tout à fait.Donc, vous pouvez le faire:
... pour la raccourcir, mais vous ne pouvez pas vous en débarrasser complètement.
Par conséquent,
use Blog
est inutile, mais je crois que vous pourriez écrire:Notez que vous devez utiliser l'un des principaux
\
ici pour forcer l'analyseur en sachant queReallyLongNSName
est complet. Ce n'est pas vrai pourBlog\Article
, ce qui est bien évidemment déjà une chaîne d'espaces de noms:use
chose est réellement inutile, pourrait tout aussi bien être un acronyme pour ça 🙂use
déclaration, parce que ses arguments sont toujours considérée comme absolue (c'est à dire, à partir de l'espace de noms global). 2)use Blog;
n'est pas forcément inutile: par exemple, à partir d'un fichier d'espace de noms commeBlog\Util\CLI
, il vous permettrait d'écrireBlog\Entry::method()
au lieu de\Blog\Entry::method()
. Non pas que ce qui est vraiment nécessaire, mais il a un effet. Pour un exemple de cette utilisation, voir la Nette cadre.Depuis que cette question apparaît comme le premier résultat sur Google pour cette erreur, je vais dire comment je l'ai corrigé.
En gros si vous avez un cadre, dire comme Yii2 vous servira à avoir à faire déclarer des classes comme:
Vous obtiendrez cette erreur sur
Use Yii
étant donné que cette classe n'a pas d'espace de noms.Étant donné que cette classe n'a pas d'espace de noms, il hérite automatiquement le symbole mondial de la table et n'a donc pas besoin des choses comme cette définition, il suffit de retirer.
use \Password
mais php n'aime pas quand vous essayez de le faire sans un alias, de sorte que mêmeuse \Password as Password
fonctionne très bien.La
utilisation
déclaration en PHP est vraiment juste une commodité pour l'alias d'un long espace de noms dans quelque chose qui peut être un peu plus facile à lire. Il ne fait pas inclure tous les fichiers ou faire autre chose, que les effets de votre développement, en plus de fournir la commodité. Depuis,Blog
n'est pas un alias comme quelque chose que vous n'êtes pas gagner tout le confort. Je ne pouvais imaginer que vous pourriez faire quelque chose commeuse \Blog as B;
Et qui peut même travail. (Il pourrait être argumenté vous fait perdre la commodité ici, en obscurcissant mais ce n'est pas ce que la question est à propos), Car vous êtes réellement en utilisant un alias pour la
Blog
espace de noms à autre chose. À l'aide deBlog\Article
fonctionne parce que, selon les docs:De sorte que votre extrait de code serait équivalent à:
use \Blog as B;
B
sauf si vous êtes activement à l'écriture désuète code ou strictement désir de causer d'autres maux de tête.Le message d'erreur "L'instruction d'utilisation ... n'a pas d'effet..." apparaît également si vous essayez d'utiliser un trait avant une définition de classe.
si vous ne souhaitez pas utiliser le "comme" de la syntaxe comme
définir un espace de noms pour le fichier