web-dev-qa-db-fra.com

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

Obtenir cette erreur quand je mets use Blog; au sommet.

Avertissement: L'instruction d'utilisation avec le nom non composé 'Blog' n'a aucun effet dans ...

Blog est mon espace de noms dans lequel j'ai 3 classes: Article, List et Category et quelques fonctions.

Si je change mon statut en use Blog\Article; alors ça marche ...

Puis-je simplement spécifier les espaces de noms que je veux utiliser? Dois-je donner des cours?

Et 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 préfixer \Blog\ au nom de chacun ...

74
thelolcat

use de PHP n'est pas identique à using namespace De C++; il vous permet de définir un alias, de ne pas "importer" un espace de noms et donc d'omettre complètement le qualificatif d'espace de noms.

Donc, vous pourriez faire:

use Blog\Article as BA;

... pour le 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:

use \ReallyLongNSName as RLNN;

Notez que vous devez utiliser un \ Initial ici pour forcer l’analyseur à savoir que ReallyLongNSName est 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'espacement de noms (noms d'espaces de noms qualifiés complets contenant un séparateur d'espace de noms, tels que Foo\Bar contrairement aux noms globaux qui ne le sont pas, tels que FooBar), , la barre oblique inversée n'est pas nécessaire et non recommandé, car les noms d'importation doivent être entièrement qualifiés et ne sont pas traités par rapport à l'espace de noms actuel.

77

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 sur Use Yii puisque cette classe n’a pas d’espace de noms.

Comme cette classe n'a pas d'espace de nom, elle hérite automatiquement de la table des symboles globale et n'a donc pas besoin d'éléments tels que cette définition, il suffit de la supprimer.

22
Sammaye

L'énoncé use en PHP n'est en réalité qu'un moyen pratique d'aliaser un espace de noms long en quelque chose de plus lisible. En fait, cela n'inclut aucun fichier ni aucune autre chose qui affecte votre développement, outre la commodité. Depuis, Blog n'est pas aliasé comme quoi que ce soit pour lequel vous ne tirez aucun avantage. J'imagine que vous pourriez faire quelque chose comme

use \Blog as B;

Et cela peut même fonctionner. ( On pourrait faire valoir que vous perdez réellement la commodité ici en obscurcissant mais ce n'est pas de quoi la question porte ) Parce que vous aliasez en fait le Blog espace de noms à quelque chose d'autre. En utilisant Blog\Article fonctionne parce que, selon la documentation:

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

Donc, votre extrait serait équivalent à:

use Blog\Article as Article;
4
Charles Sprayberry

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
2
samehanwar

L'erreur "L'instruction use ... n'a pas d'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
}
2
Dieter Donnert