Namespaces verwenden: Aliase/Importieren
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Die Möglichkeit, auf vollständig qualifizierte Namen mit einem Alias (Importieren) zuzugreifen, ist ein wichtiges Feature von Namespaces. Dies ist ähnlich wie die Möglichkeit von Unix-basierten Dateisystemen einen symbolischen Link auf eine Datei oder ein Verzeichnis anzulegen.
PHP unterstützt das Vergeben von Aliasen (Importe) für Konstanten, Funktionen, Klassen, Interfaces, Traits, Aufzählungen (Enums) und Namespaces.
Ein Alias wird mittels des use
-Operators angelegt. Hier ein
Beispiel, welches alle fünf Arten von Importen zeigt:
Beispiel #1 Aliase/Importieren mit dem use-Operator
<?php
namespace foo;
use My\Full\Classname as Another;
// dies ist das gleiche wie use My\Full\NSname as NSname
use My\Full\NSname;
// importiert eine globale Klasse
use ArrayObject;
// Eine Funktion importieren
use function My\Full\functionName;
// Alias für eine Funktion
use function My\Full\functionName as func;
// Eine Konstante importieren
use const My\Full\CONSTANT;
$obj = new namespace\Another; // erzeugt ein Objekt der Klasse foo\Another
$obj = new Another; // erzeugt ein Objekt der Klasse My\Full\Classname
NSname\subns\func(); // ruft die Funktion My\Full\NSname\subns\func auf
$a = new ArrayObject(array(1)); // erzeugt ein Objekt der Klasse ArrayObject
// ohne das "use ArrayObject" wäre ein Objekt der Klasse foo\ArrayObject erzeugt worden
func(); // ruft die Funktion My\Full\functionName auf
echo CONSTANT; // Gibt den Wert von My\Full\CONSTANT aus
?>
Foo\Bar
, im Gegensatz zu
globalen Namen ohne Separator, wie FooBar
) der führende
Backslash nicht notwendig und nicht empfohlen ist, weil importierte Namen vollständig
qualifiziert sein müssen und nicht relativ zum aktuellen Namespace verarbeitet
werden.
PHP unterstützt zusätzlich auch eine komfortable Kurzsyntax, mit der mehrere use-Ausdrücke in der gleichen Zeile erscheinen können.
Beispiel #2 Aliase/Importieren mit dem use-Operator, mehrere use-Ausdrücke kombiniert
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // erzeugt ein Objekt der Klasse My\Full\Classname
NSname\subns\func(); // ruft die Funktion My\Full\NSname\subns\func auf
?>
Importieren wird zur Kompilierungszeit ausgeführt und hat daher keinen Einfluss auf dynamische Klassen-, Funktions- oder Konstantennamen.
Beispiel #3 Importieren und dynamische Namen
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // erzeugt ein Objekt der Klasse My\Full\Classname
$a = 'Another';
$obj = new $a; // erzeugt ein Objekt der Klasse Another
?>
Zusätzlich beeinflusst das Importieren nur unqualifizierte und qualifizierte Namen. Vollständig qualifizierte Namen sind absolut und werden von Importen nicht beeinflusst.
Beispiel #4 Importieren und vollständig qualifizierte Namen
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // erzeugt ein Objekt der Klasse My\Full\Classname
$obj = new \Another; // erzeugt ein Objekt der Klasse Another
$obj = new Another\thing; // erzeugt ein Objekt der Klasse My\Full\Classname\thing
$obj = new \Another\thing; // erzeugt ein Objekt der Klasse Another\thing
?>
Gültigkeitsbereiche für Importe
Das Schlüsselwort use
muss im äußersten Gültigkeitsbereich
(dem globalen Gültigkeitsbereich) oder innerhalb einer Namespace-Deklaration
angegeben werden. Das ist darin begründet, dass Importe zur Kompilierungszeit
und nicht zur Laufzeit durchgeführt werden und daher nicht in einem anderen
Gültigkeitsbereich liegen dürfen. Das folgende Beispiel zeigt eine ungültige
Verwendung des use
-Schlüsselwortes:
Beispiel #5 Ungültige Importregel
<?php
namespace Languages;
function toGreenlandic()
{
use Languages\Danish;
// ...
}
?>
Hinweis:
Importregeln sind auf Dateibasis gültig, das heißt eine eingebundene Datei wird NICHT die Importregeln der einbindenden Datei erben.
Gruppierte use
Deklarationen
Klassen, Funktionen und Konstanten, die aus dem
gleichen Namespace importiert werden, in einer einzigen use
Anweisung gruppiert werden.
<?php
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// gleichbedeutend zu folgender gruppierter Use-Deklaration
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};