Importieren von Klassen und Namespaces in PHP: Welchen Unterschied macht ein führender Backslash?
Was ist der Unterschied zwischen diesen beiden:
use Exception;
use \Exception;
Oder jene:
use Foo\Bar;
use \Foo\Bar;
Den Handbuch sagt:
Beachten Sie, dass für den Namespace-Namen (vollständig
qualifizierten namespace-Namen mit
namespace-separator, wie Foo\Bar
im Gegensatz zu globalen Namen
nicht, wie FooBar) der führende
backslash nicht notwendig und nicht
erlaubt ist, weil importierte Namen müssen vollständig sein
qualifiziert, und werden nicht verarbeitet
relativ zum aktuellen namespace.
Aber ich weiß nicht wirklich verstehen, weil alle der oben genannten Varianten arbeiten, d.h. es ist definitiv nicht "nicht erlaubt".
Einen Blick in zend_do_use
zeigte sich, dass is_global
(gesetzt, wenn es einen führenden backslash) wird nur eine Warnung in den folgenden Fällen:
namespace {
use Exception;
}
Die mir sagt: "Die use-Anweisung mit nicht-zusammengesetzten Namen 'Ausnahme' keine Wirkung hat". (Obwohl das gleiche machen use \Exception
hätte nur wenig Effekt, aber nicht werfen, eine Warnung.)
Also Bin ich etwas fehlt? Gibt es da eigentlich einen Unterschied?
InformationsquelleAutor der Frage NikiC | 2011-01-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Handbuch gibt den backslash als unnötigewas natürlich bedeutet, dass, wenn Sie immer noch benutzen, dass die Bedeutung gleichwertig ist. Jedoch, wie haben Sie darauf hingewiesen, das Handbuch sagt, dass es angeblich nicht erlaubt ist, was falsch ist.
Jedoch ist es etwas anderes beunruhigend mit dem Handbuch. Sie werben für dieses:
Wenn es wahr ist, dass die import-Namen werden nicht verarbeitet, relativ zum aktuellen namespace, dann
use \ArrayObject
unduse ArrayObject
muss dieselbe Bedeutung haben. Was sonst könnteuse ArrayObject
beziehen sich auf andere als die Globale? In der Praxis, der Motor wird importieren Sie die Globale.Auch, mit Fehlern wie diesem:
http://bugs.php.net/bug.php?id=49143
Ich glaube, es gibt Verwirrung darüber, was der standard sein soll.
Deine Frage zu beantworten: es gibt keinen Unterschied. Allerdings, wenn ich die engine-Entwickler, der auch ein Gläubiger, der keinen führenden Schrägstrich standard, dann würde ich nicht brauchen, um betrachten einen Fall, wo jemand schrieb
use \Exception;
. Ich glaube, dies war wahrscheinlich der Fall.InformationsquelleAutor der Antwort erisco
In der Tat gibt es keinen Unterschied in der Verwendung von führenden backslash im importieren von namespaces im moment und auch Informationen in PHP-Handbuch hat sich geändert:
So, jetzt gibt es echte Informationen, die mit führenden backslash ist nicht empfohlen, aber es gibt keine info, dass es nicht erlaubt war es in der Vergangenheit.
Also im moment:
diese 2 Zeilen die gleiche Arbeit, aber Sie sollten lieber die erste.
InformationsquelleAutor der Antwort Marcin Nabiałek
Normalerweise den führenden Schrägstrich definiert, dass der Bezeichner ist absolute. Wenn Ihr fehlt, ist der interpreter geht davon aus, dass es eine relative identifier.
Dies ist eine absolute id:
Dies ist ein relativer Bezeichner, weil der keinen führenden Schrägstrich. Es ist relativ zum aktuellen namespace:
Dies ist auch eine relative identifier. In diesem Fall ist es aufgelöst
use
- Anweisung, weil der Letzte Teil (alias) ist die gleiche, wie die erste der Klasse:Jedoch, weil in
namespace
unduse
Aussagen nur absolute Bezeichner (vollständig qualifizierte Namen) erlaubt sind, ist es ok, es zu unterlassen hier. Innamespace
es ist sogar nicht erlaubt, um die führende backslash.Weitere Informationen, wie Sie PHP behebt die verschiedenen namespace-Deklarationen finden Sie in der namespace-Regeln manuell.
InformationsquelleAutor der Antwort KingCrunch
le nicht sagen, wir haben
dann der erste Einsatz tatsächlich Einfuhren Klasse MyNamespace\Exception und der zweite nur die main-Klasse \Exception
so können Sie etwas haben, wie
und dann kann ich
InformationsquelleAutor der Antwort Andy
Den führenden umgekehrten Schrägstrich bedeutet, dass der Globale namespace. Wenn Sie in einem namespace-Gültigkeitsbereich, die Sie haben, zu verwenden, zu erreichen, den globalen namespace. Zum Beispiel:
Mit führenden Schrägstrich haben Sie den absoluten Pfad, und ohne ihn haben Sie den relativen Pfad.
InformationsquelleAutor der Antwort inf3rno