Frage

Was ist der Unterschied zwischen diesen beiden:

use Exception;
use \Exception;

Oder jene:

use Foo\Bar;
use \Foo\Bar;

Das Handbuch sagt:

Beachten Sie, dass für Namespa -Namen (voll qualifizierte Namespace -Namen, die den Namespace -Trennzeichen enthalten, wie z. und werden nicht relativ zum aktuellen Namespace verarbeitet.

Aber ich verstehe das nicht wirklich, da alle oben genannten Varianten funktionieren, dh es ist definitiv nicht "nicht erlaubt".

Ein Blick darauf zend_do_use zeigte, dass is_global (Set, wenn es einen führenden Backslash gibt) wird nur für eine Warnung im folgenden Fall verwendet:

namespace {
    use Exception;
}

Was mir sagt: "Die Verwendungsanweisung mit nicht kompoundem Namen" Ausnahme "hat keine Wirkung". (Obwohl das Gleiche mit use \Exception hätte genauso wenig Effekt, werfen aber keine Warnung.)

Also: Vermisse ich etwas? Gibt es tatsächlich einen Unterschied?

War es hilfreich?

Lösung

Das Handbuch gibt den Backslash als an nicht notwendig, was natürlich bedeutet, dass die Bedeutung, wenn Sie sie noch verwenden, gleichwertig ist. Wie Sie jedoch betont haben, heißt es jedoch, dass es angeblich nicht erlaubt ist, was falsch ist.

Das Handbuch ist jedoch noch etwas beunruhigendes. Sie werben dafür:

// importing a global class
use \ArrayObject;

Wenn es wahr ist, dass Importnamen nicht in Bezug auf den aktuellen Namespace verarbeitet werden, dann werden dann use \ArrayObject und use ArrayObject muss die gleiche Bedeutung haben. Was könnte sonst noch use ArrayObject Beziehen Sie sich auf andere als das globale? In der Praxis wird der Motor den globalen importieren.

Auch mit solchen Fehler:http://bugs.php.net/bug.php?id=49143

Ich glaube, es gibt Verwirrung darüber, was der Standard sein soll.

Um Ihre Frage zu beantworten: Es gibt keinen Unterschied. Wenn ich jedoch der Motorentwickler wäre, der auch an den No-Leading-Slash-Standard glaubte, müsste ich keinen Fall in Betracht ziehen, in dem jemand schrieb use \Exception;. Ich glaube, das war wahrscheinlich der Fall.

Andere Tipps

Tatsächlich gibt es keinen Unterschied bei der Verwendung des führenden Backslashs beim Importieren von Namespaces und auch in Informationen in PHP -Handbuch hat sich verändert:

Beachten Sie, dass für Namespa -Namen (vollständig qualifizierte Namespace -Namen, die den Namespace -Trennzeichen enthalten, wie z. nicht empfohlen, da die Importnamen vollständig qualifiziert sein müssen und nicht in Bezug auf den aktuellen Namespace verarbeitet werden.

Jetzt gibt es also echte Informationen darüber, dass die Verwendung von führenden Backslash nicht empfohlen wird, aber es gibt keine Informationen, dass es in der Vergangenheit nicht erlaubt ist.

Also im Moment:

use Exception;
use \Exception;

Diese 2 Zeilen funktionieren gleich, aber Sie sollten lieber den ersten verwenden.

Normalerweise definiert der führende Backslash, dass die Kennung absolut ist. Wenn es fehlt, geht der Dolmetscher davon aus, dass es sich um eine relative Kennung handelt.

Dies ist eine absolute Kennung:

$x = new \Name\Space\To\Class();

Dies ist eine relative Kennung, da der No -führende Schrägstrich. Es ist relativ zum aktuellen Namespace:

namespace Name\Space;
$x = new To\Class;

Dies ist auch eine relative Kennung. In diesem Fall wurde es gegen die gelöst use Aussage, weil der letzte Teil (Alias) gleich ist wie der erste der Klasse:

namespace Other\Name\Space;
use Name\Space;
$x = new Space\To\Class;

Aber weil in namespace und use Aussagen Nur absolute Kennungen (vollständig qualifizierte Namen) sind erlaubt, es ist in Ordnung, sie hier wegzulassen. Im namespace, Es darf sogar den führenden Backslash nicht einstellen.

Weitere Informationen darüber, wie PHP die verschiedenen Namespace -Deklarationen auflöst Namespace Rules Manual.

Ich sagen nicht, dass wir haben

namespace MyNamespace
use Exception;
use \Exception;

Dann importiert die erste Verwendung tatsächlich die Klasse myNameSpace Ausnahme und die zweite nur die Hauptklasse Ausnahme

So können Sie so etwas haben wie

namespace MyNamespace;
class Exception extends \Exception{ }

Und dann kann ich

throw new \Exception('Exception from global namespace');
throw new \MyNamespace\Exception('Exception from MyNamespace');

Der führende Backslash bedeutet den globalen Namespace. Wenn Sie sich im Rahmen eines Namespace befinden, müssen Sie das verwenden, um den globalen Namespace zu erreichen. Zum Beispiel:

namespace A
{
    class A
    {
        public function __construct()
        {
            echo('namespace: A<br />');
        }
    }
}

namespace B\A
{
    class A
    {
        public function __construct()
        {
            echo('namespace: B\\A<br />');
        }
    }
}

namespace B
{
    class B
    {
        public function __construct()
        {
            new \A\A(); // namespace: A
            new A\A(); // namespace: B\A
        }
    }
    new B();
}

Mit dem führenden Backslash haben Sie den absoluten Weg und ohne ihn den relativen Weg.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top