Dépannage «L'instruction d'utilisation avec un nom non composé… n'a aucun effet»

95

Obtenir cette erreur lorsque je mets use Blog;en haut.

Attention: l'instruction d'utilisation avec le nom non composé 'Blog' n'a aucun effet sur ...

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

Si je change ma déclaration en use Blog\Article; alors cela fonctionne ...

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

Et si j'ai des fonctions dans ces espaces de noms? Quand je les appelle en dehors de l'espace de noms, je suis obligé de faire précéder \Blog\le nom de chacun ...

thelolcat
la source
non, je n'utilise aucun framework
thelolcat
1
M'est arrivé quand j'ai déclaré mon dossier namespace après use Blah; .
Derek Illchuk
Cela peut aussi simplement signifier que "Blog" a déjà été inclus et que vous essayez de l'utiliser une deuxième fois. Ceci est courant si vous utilisez un framework qui l'incluait déjà plus haut dans la chaîne.
Rhu
@DerekIllchuk si seulement cela pouvait être une réponse que je pourrais voter. M'a sauvé beaucoup de maux de tête.
J'essaye tellement mais je pleure plus fort le

Réponses:

90

PHP usen'est pas le même que celui de C ++ using namespace; il vous permet de définir un alias , de ne pas "importer" un espace de noms et donc d'omettre désormais complètement le qualificatif d'espace de noms.

Donc, vous pouvez faire:

use Blog\Article as BA;

... pour le raccourcir, mais vous ne pouvez pas vous en débarrasser entièrement.


Par conséquent, use Blogc'est inutile, mais je crois que vous pourriez écrire:

use \ReallyLongNSName as RLNN;

Notez que vous devez utiliser un début \ici pour forcer l'analyseur à savoir qu'il ReallyLongNSNameest pleinement qualifié. Ce n'est pas vrai pour Blog\Article, qui est évidemment déjà une chaîne d'espaces de noms:

Notez que pour les noms d'espaces de noms ( noms d'espaces de noms complets contenant un séparateur d'espace de noms, par exemple, Foo\Bar par opposition aux noms globaux qui ne le font pas, tels queFooBar ), la barre oblique inverse de début est inutile et déconseillée, car les noms d'importation doivent être pleinement qualifiés et ne sont pas traités par rapport à l'espace de noms actuel.

Courses de légèreté en orbite
la source
22
Ah ça craint. Donc, la usechose est en fait inutile, pourrait aussi bien être un acronyme pour cela :)
thelolcat
1
@thelolcat: Il a ses utilisations ... mais pas celle que vous voulez. :) Il ne semble que cela pourrait être une limitation gênante.
Courses de légèreté en orbite le
7
Cette réponse n'est correcte que pour les fichiers sans espace de nom. 1) Dans un fichier à espace de noms, il n'est pas nécessaire d'utiliser un \ au usedébut de l'instruction, car ses arguments sont toujours considérés comme absolus (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 dont l'espace de nom est as Blog\Util\CLI, il vous permettrait d'écrire à la Blog\Entry::method()place de \Blog\Entry::method(). Non pas que cela soit vraiment nécessaire, mais cela a un effet. Pour un exemple de cette utilisation, consultez le framework Nette.
Zilk
24

Puisque cette question apparaît comme le premier résultat sur Google pour cette erreur, je vais indiquer comment je l'ai corrigée.

En gros, si vous avez un framework, disons comme Yii2, vous serez habitué à devoir déclarer des classes comme:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

Vous obtiendrez cette erreur Use Yiicar 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 de symboles globale et n'a donc pas besoin de choses comme celle-ci, supprimez-la simplement.

Sammaye
la source
OUI! Cela avait tout le sens! :)
Mārtiņš Briedis
1
Pour moi, le problème était que j'essayais d'utiliser un symbole de l'espace de noms global, par exemple, use \Passwordmais php n'aime pas ça quand vous essayez de faire ça sans alias, donc ça use \Password as Passwordmarche même très bien.
Kzqai le
Évalué pour avoir suggéré l'utilisation d'OOD lorsque le modérateur cherchait une réponse plus générale concernant l'utilisation des espaces de noms.
Josh Habdas
1
@JoshH de quoi parlez-vous? Je n'ai même pas votre dernière réponse. Vous êtes passé de dire que ce n'est pas ce qu'un modérateur recherchait pour donner le lien d'un type à propos de la pêche à la traîne OOP
Sammaye
1
@JoshH (BTW, je déteste quand les gens font référence à des blogs d'opinion comme celui-là comme matériel faisant autorité pour répondre à une question)
Sammaye
6

L' useinstruction en PHP n'est en réalité qu'une commodité pour aliaser un long espace de noms en quelque chose qui peut être un peu plus facile à lire. Il n'inclut en fait aucun fichier ou ne fait rien d'autre, qui affecte votre développement, en plus de fournir une commodité. Depuis, Blogn'est pas aliasé comme quoi que ce soit, vous ne gagnez aucune commodité. Je pourrais imaginer que tu pourrais faire quelque chose comme

use \Blog as B;

Et cela peut même fonctionner. ( On pourrait dire que vous perdez en fait la commodité ici en obscurcissant mais ce n'est pas le sujet de la question ) Parce que vous aliasez en fait l' Blogespace de noms vers autre chose. L'utilisation Blog\Articlefonctionne car, selon la documentation:

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

Ainsi, votre extrait serait équivalent à:

use Blog\Article as Article;
Charles Sprayberry
la source
1
BN'appelez jamais rien à moins que vous n'écriviez activement du code non maintenable ou que vous souhaitiez strictement causer des maux de tête aux autres.
Josh Habdas
2

L'erreur "L'instruction use ... n'a aucun effet ..." 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
}
Dieter Donnert
la source
2

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
samehanwar
la source