PHP
Namensräume
Suche…
Bemerkungen
Aus der PHP-Dokumentation :
Was sind Namespaces? In der weitesten Definition sind Namespaces eine Möglichkeit, Elemente einzukapseln. Dies kann vielerorts als abstrakt betrachtet werden. Beispielsweise dienen Verzeichnisse in Betriebssystemen dazu, verwandte Dateien zu gruppieren, und fungieren als Namensraum für die darin enthaltenen Dateien. Als ein konkretes Beispiel kann die Datei foo.txt sowohl im Verzeichnis / home / greg als auch in / home / other vorhanden sein, aber zwei Kopien von foo.txt können nicht in demselben Verzeichnis vorhanden sein. Um auf die Datei foo.txt außerhalb des Verzeichnisses / home / greg zuzugreifen, müssen Sie dem Dateinamen den Verzeichnisnamen mit dem Verzeichnisseparator voranstellen, um /home/greg/foo.txt zu erhalten. Das gleiche Prinzip gilt für Namensräume in der Programmierwelt.
Beachten Sie, dass die Top-Level-Namespaces PHP
und php
für die PHP-Sprache selbst reserviert sind. Sie sollten nicht in benutzerdefiniertem Code verwendet werden.
Namespaces deklarieren
Eine Namespace-Deklaration kann wie folgt aussehen:
-
namespace MyProject;
- Deklarieren Sie den NamespaceMyProject
-
namespace MyProject\Security\Cryptography;
- Deklarieren Sie einen verschachtelten Namespace -
namespace MyProject { ... }
- Deklarieren Sie einen Namespace mit umschließenden Klammern.
Es wird empfohlen, nur einen einzelnen Namespace pro Datei zu deklarieren, obwohl Sie in einer einzigen Datei beliebig viele deklarieren können:
namespace First {
class A { ... }; // Define class A in the namespace First.
}
namespace Second {
class B { ... }; // Define class B in the namespace Second.
}
namespace {
class C { ... }; // Define class C in the root namespace.
}
Jedes Mal, wenn Sie einen Namespace deklarieren, gehören Klassen, die Sie danach definieren, zu diesem Namespace:
namespace MyProject\Shapes;
class Rectangle { ... }
class Square { ... }
class Circle { ... }
Eine Namespace-Deklaration kann in verschiedenen Dateien mehrfach verwendet werden. Im obigen Beispiel wurden drei Klassen im Namespace MyProject\Shapes
in einer einzigen Datei definiert. Vorzugsweise wird dies in drei Dateien aufgeteilt, die jeweils mit dem namespace MyProject\Shapes;
. Dies wird im Standardbeispiel PSR-4 näher erläutert.
Verweis auf eine Klasse oder Funktion in einem Namespace
Wie in Deklarieren von Namespaces gezeigt , können wir eine Klasse in einem Namespace wie folgt definieren:
namespace MyProject\Shapes;
class Rectangle { ... }
Um auf diese Klasse zu verweisen, muss der vollständige Pfad (einschließlich des Namespaces) verwendet werden:
$rectangle = new MyProject\Shapes\Rectangle();
Dies kann durch den Import der Klasse über die use
-statement verkürzt werden:
// Rectangle becomes an alias to MyProject\Shapes\Rectangle
use MyProject\Shapes\Rectangle;
$rectangle = new Rectangle();
Wie in PHP 7.0 können Sie verschiedene use
in einer einzigen Anweisung mit Klammern gruppieren:
use MyProject\Shapes\{
Rectangle, //Same as `use MyProject\Shapes\Rectangle`
Circle, //Same as `use MyProject\Shapes\Circle`
Triangle, //Same as `use MyProject\Shapes\Triangle`
Polygon\FiveSides, //You can also import sub-namespaces
Polygon\SixSides //In a grouped `use`-statement
};
$rectangle = new Rectangle();
Manchmal haben zwei Klassen denselben Namen. Dies ist kein Problem, wenn sie sich in einem anderen Namespace befinden, es kann jedoch zu einem Problem werden, wenn versucht wird, sie mit der use
-statement zu importieren:
use MyProject\Shapes\Oval;
use MyProject\Languages\Oval; // Apparantly Oval is also a language!
// Error!
Sie können dieses Problem lösen, indem Sie mit dem Schlüsselwort as
einen Namen für den Aliasnamen definieren:
use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;
Um auf eine Klasse außerhalb des aktuellen Namespaces zu verweisen, muss sie mit einem \
, andernfalls wird ein relativer Namespacepfad aus dem aktuellen Namespace angenommen:
namespace MyProject\Shapes;
// References MyProject\Shapes\Rectangle. Correct!
$a = new Rectangle();
// References MyProject\Shapes\Rectangle. Correct, but unneeded!
$a = new \MyProject\Shapes\Rectangle();
// References MyProject\Shapes\MyProject\Shapes\Rectangle. Incorrect!
$a = new MyProject\Shapes\Rectangle();
// Referencing StdClass from within a namespace requires a \ prefix
// since it is not defined in a namespace, meaning it is global.
// References StdClass. Correct!
$a = new \StdClass();
// References MyProject\Shapes\StdClass. Incorrect!
$a = new StdClass();
Was sind Namensräume?
Die PHP-Community hat viele Entwickler, die viel Code erstellen. Dies bedeutet, dass der PHP-Code einer Bibliothek denselben Klassennamen wie eine andere Bibliothek verwenden kann. Wenn beide Bibliotheken in demselben Namespace verwendet werden, kollidieren sie und verursachen Probleme.
Namensräume lösen dieses Problem. Wie im PHP-Referenzhandbuch beschrieben, können Namespaces mit Betriebssystemverzeichnissen verglichen werden, die Namespacedateien enthalten. zwei Dateien mit demselben Namen können in separaten Verzeichnissen vorhanden sein. Ebenso können zwei PHP-Klassen mit demselben Namen in separaten PHP-Namespaces vorhanden sein.
Es ist wichtig, dass Sie Ihren Code mit einem Namensraum versehen, damit er von anderen Entwicklern verwendet werden kann, ohne befürchten zu müssen, mit anderen Bibliotheken zusammenzustoßen.
Deklaration von Sub-Namespaces
Um einen einzelnen Namespace mit Hierarchie zu deklarieren, verwenden Sie folgendes Beispiel:
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
Das obige Beispiel erstellt:
Konstante MyProject\Sub\Level\CONNECT_OK
Klasse MyProject\Sub\Level\Connection
und
Funktion MyProject\Sub\Level\connect