122 votes

Dépannage "L'instruction d'utilisation avec un nom non composé ... n'a pas d'effet"

J'obtiens cette erreur lorsque je mets use Blog; au sommet.

Avertissement : L'instruction d'utilisation avec le nom non composé "Blog" n'a pas d'effet en...

Blog est mon espace de noms dans lequel j'ai 3 classes : Article, Liste et Catégorie et quelques fonctions.

Si je modifie ma déclaration en use Blog\Article; puis cela fonctionne...

Ne puis-je pas simplement spécifier les espaces de noms que je veux utiliser ? Dois-je fournir des classes ?

Que se passe-t-il si j'ai des fonctions dans cet espace de noms ? Lorsque je les appelle en dehors de l'espace de noms, je suis obligé de faire précéder le nom de la fonction de la mention \Blog\ au nom de chacun...

106voto

Lightness Races in Orbit Points 122793

PHP's use n'est pas la même que celle de C++ using namespace ; il permet de définir un alias ne pas "importer" un espace de noms et donc, dorénavant, omettre complètement le qualificatif d'espace de noms.

Vous pouvez donc le faire :

use Blog\Article as BA;

... de la raccourcir, mais vous ne pouvez pas vous en débarrasser complètement.


En conséquence, use Blog est inutile, mais je crois que vous pourriez écrire :

use \ReallyLongNSName as RLNN;

Notez que vous devez utiliser un \ ici pour forcer l'analyseur à savoir que ReallyLongNSName est pleinement qualifié. Ce n'est pas le cas pour Blog\Article qui est manifestement déjà une chaîne d'espaces de noms :

Il convient de noter que pour les noms à espace de noms (noms d'espace de noms pleinement qualifiés contenant un séparateur d'espace de noms, tels que Foo\Bar par opposition aux noms globaux qui ne le sont pas, tels que FooBar ), la barre oblique inverse n'est pas nécessaire et n'est pas recommandée, car les noms d'importation doivent être pleinement qualifiés et ne sont pas traités par rapport à l'espace de noms actuel.

36voto

Sammaye Points 21778

Étant donné que cette question apparaît comme le premier résultat sur Google pour cette erreur, je vais expliquer comment je l'ai résolue.

En fait, si vous avez un framework, comme Yii2 par exemple, vous serez habitué à devoir déclarer des classes comme :

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

Vous obtiendrez cette erreur sur Use Yii puisque cette classe n'a pas d'espace de noms.

Comme cette classe n'a pas d'espace de noms, elle hérite automatiquement de la table des symboles globale et n'a donc pas besoin de définir des éléments comme celui-ci, il suffit de le supprimer.

9voto

cspray Points 4979

En use en PHP n'est en fait qu'une commodité permettant d'aliaser un long espace de noms en quelque chose d'un peu plus facile à lire. Il n'inclut en fait aucun fichier et ne fait rien d'autre qui affecte votre développement, en dehors de la commodité qu'il offre. Depuis, Blog n'est pas aliasé comme quoi que ce soit, vous ne bénéficiez d'aucune commodité. Je pourrais imaginer que vous puissiez faire quelque chose comme

use \Blog as B;

Et cela peut même fonctionner. ( On pourrait dire que vous perdez en fait en commodité en obscurcissant, mais ce n'est pas le sujet de la question. ) Parce que vous créez un alias pour l'élément Blog à quelque chose d'autre. L'utilisation de l'espace de noms Blog\Article fonctionne parce que, selon les documents :

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

Votre extrait serait donc équivalent à :

use Blog\Article as Article;

6voto

samehanwar Points 937

Si vous ne voulez pas utiliser la syntaxe "as" comme

use \Blog as B;

définir un espace de noms pour le fichier

namespace anyname;

use Blog

2voto

Dieter Donnert Points 104

L'erreur "The use statement ... has no effect..." apparaît également si vous essayez d'utiliser un trait avant une définition de classe.

use My_trait; // should not be here

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X