Fehlerbehebung "Die use-Anweisung mit nicht zusammengesetztem Namen ... hat keine Auswirkung"

94

Diesen Fehler bekommen, wenn ich oben setze use Blog;.

Warnung: Die use-Anweisung mit dem nicht zusammengesetzten Namen 'Blog' hat keine Auswirkung auf ...

Blog ist mein Namespace, in dem ich 3 Klassen habe: Artikel, Liste und Kategorie und einige Funktionen.

Wenn ich meine Statistik auf ändere, use Blog\Article;funktioniert es ...

Kann ich nicht einfach die Namespaces angeben, die ich verwenden möchte? Muss ich Unterricht anbieten?

Was ist, wenn ich Funktionen in diesen Namespaces habe? Wenn ich sie außerhalb des Namespace anrufe, muss ich \Blog\jedem Namen einen Namen voranstellen ...

thelolcat
quelle
Nein, ich benutze kein Framework
Thelolcat
1
Ist mir passiert, als ich meine Datei namespace danach deklariert habe use Blah;.
Derek Illchuk
Es kann auch nur bedeuten, dass 'Blog' bereits enthalten ist und Sie versuchen, es ein zweites Mal zu verwenden. Dies ist häufig der Fall, wenn Sie ein Framework verwenden, das es bereits weiter oben in der Kette enthält.
Rhu
@DerekIllchuk, wenn dies nur eine Antwort sein könnte, die ich positiv bewerten könnte. Hat mir viel Kopfschmerzen erspart.
Ich versuche es so sehr, aber ich weine stärker

Antworten:

90

PHPs usesind nicht dasselbe wie C ++ using namespace; Sie können einen Alias definieren , keinen Namespace "importieren" und daher das Namespace-Qualifikationsmerkmal von nun an ganz weglassen.

Sie könnten also Folgendes tun:

use Blog\Article as BA;

... um es zu verkürzen, aber Sie können es nicht ganz loswerden.


Folglich use Blogist nutzlos, aber ich glaube, Sie könnten schreiben:

use \ReallyLongNSName as RLNN;

Beachten Sie, dass Sie hier eine Überschrift verwenden müssen \, um den Parser zu zwingen, zu wissen, dass er ReallyLongNSNamevoll qualifiziert ist. Dies gilt nicht für Blog\Article, was offensichtlich bereits eine Kette von Namespaces ist:

Beachten Sie, dass für Namespace-Namen (vollständig qualifizierte Namespace-Namen mit Namespace-Trennzeichen, z. B. Foo\Bar im Gegensatz zu globalen Namen, die dies nicht tunFooBar ) der führende Backslash nicht erforderlich und nicht empfohlen ist, da Importnamen vollständig qualifiziert sein müssen und nicht verarbeitet werden relativ zum aktuellen Namespace.

Leichtigkeitsrennen im Orbit
quelle
22
Ah das ist scheiße. Also das useDing ist eigentlich nutzlos, könnte genauso gut ein Akronym dafür sein :)
thelolcat
1
@thelolcat: Es hat seine Verwendung ... nur nicht die, die Sie wollen. :) Es ist scheinen , wie es eine lästige Einschränkung sein könnte.
Leichtigkeitsrennen im Orbit
7
Diese Antwort ist nur für Dateien ohne Namespace korrekt. 1) In einer Namespace-Datei muss in der useAnweisung kein führendes \ verwendet werden , da ihre Argumente immer als absolut angesehen werden (dh ausgehend vom globalen Namespace). 2) use Blog;ist nicht unbedingt nutzlos: Zum Beispiel Blog\Util\CLIwürde es Ihnen aus einer Datei mit dem Namensraum als ermöglichen, Blog\Entry::method()statt zu schreiben \Blog\Entry::method(). Nicht, dass dies wirklich notwendig wäre, aber es hat Auswirkungen. Ein Beispiel für diese Verwendung finden Sie im Nette-Framework.
Zilk
24

Da diese Frage als erstes Ergebnis bei Google für diesen Fehler angezeigt wird, werde ich angeben, wie ich sie behoben habe.

Wenn Sie ein Framework wie Yii2 haben, sind Sie es gewohnt, Klassen wie folgt deklarieren zu müssen:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

Sie erhalten diesen Fehler, Use Yiida diese Klasse keinen Namespace hat.

Da diese Klasse keinen Namespace hat, erbt sie automatisch die globale Symboltabelle und benötigt daher keine derartigen Definitionen. Entfernen Sie sie einfach.

Sammaye
quelle
JA! Das machte Sinn! :)
Mārtiņš Briedis
1
Für mich war das Problem, dass ich versucht habe, ein Symbol aus dem globalen Namespace zu verwenden, z. B. use \Passwordaber PHP mag es nicht, wenn Sie versuchen, dies ohne Alias ​​zu tun, also use \Password as Passwordfunktioniert es sogar einwandfrei.
Kzqai
Abgestimmt für den Vorschlag, OOD zu verwenden, als der Moderator nach einer allgemeineren Antwort in Bezug auf die Verwendung von Namespaces suchte.
Josh Habdas
1
@JoshH worüber machst du? Ich bekomme nicht einmal deine letzte Antwort. Sie haben nicht mehr gesagt, dass es nicht das ist, wonach ein Moderator gesucht hat, sondern einem Mann einen Link über OOP-Trolling gegeben
Sammaye,
1
@ JoshH (Übrigens hasse ich es, wenn Leute solche Blogs als maßgebliches Material für die Beantwortung einer Frage bezeichnen)
Sammaye
6

Die useAnweisung in PHP ist wirklich nur eine Annehmlichkeit, um einen langen Namespace in etwas zu aliasen, das möglicherweise etwas einfacher zu lesen ist. Es enthält keine Dateien oder andere Aktionen, die sich auf Ihre Entwicklung auswirken, außer auf Komfort. Da Blogist nicht alias als irgendetwas, das Sie nicht von der Bequemlichkeit gewinnen. Ich könnte mir vorstellen, dass Sie so etwas tun könnten

use \Blog as B;

Und das kann sogar funktionieren. ( Es könnte argumentiert werden, dass Sie hier tatsächlich die Bequemlichkeit verlieren, indem Sie verdecken, aber darum geht es bei der Frage nicht. ) Weil Sie den BlogNamespace tatsächlich auf etwas anderes aliasen. Verwenden Blog\Articlefunktioniert, weil laut den Dokumenten:

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

Ihr Snippet wäre also gleichbedeutend mit:

use Blog\Article as Article;
Charles Sprayberry
quelle
1
Bitte rufen BSie niemals etwas an, es sei denn, Sie schreiben aktiv nicht wartbaren Code oder möchten unbedingt anderen Kopfschmerzen bereiten.
Josh Habdas
2

Der Fehler "Die use-Anweisung ... hat keine Auswirkung ..." wird auch angezeigt, wenn Sie versuchen, ein Merkmal vor einer Klassendefinition zu verwenden.

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}
Dieter Donnert
quelle
2

wenn Sie nicht 'als' Syntax wie verwenden möchten

use \Blog as B;

Definieren Sie einen Namespace für die Datei

namespace anyname;

use Blog
Samehanwar
quelle