Heim > Artikel > Backend-Entwicklung > Grundlagen der Verwendung von PHP-Namespaces
Bevor wir die Verwendung von Namespaces besprechen, müssen Sie verstehen, woher PHP weiß, welche Namespace-Elemente verwendet werden sollen. Es kann eine einfache Analogie zwischen dem PHP-Namespace und dem Dateisystem gezogen werden. Es gibt drei Möglichkeiten, auf eine Datei im Dateisystem zuzugreifen:
Relatives Dateinamenformat wie foo.txt. Es wird als currentdirectory/foo.txt geparst, wobei currentdirectory das aktuelle Verzeichnis darstellt. Wenn das aktuelle Verzeichnis also /home/foo ist, wird der Dateiname in /home/foo/foo.txt aufgelöst.
Das Format des relativen Pfadnamens ist beispielsweise Unterverzeichnis/foo.txt. Es wird als aktuelles Verzeichnis/Unterverzeichnis/foo.txt analysiert.
Der absolute Pfadname hat die Form /main/foo.txt. Es wird als /main/foo.txt geparst.
Elemente im PHP-Namespace verwenden das gleiche Prinzip. Beispielsweise kann auf einen Klassennamen auf drei Arten verwiesen werden:
als unqualifizierter Name oder als Klassenname ohne Präfix, z. B. $a=new foo(); oder foo::staticmethod();. Wenn der aktuelle Namespace currentnamespace ist, wird foo in currentnamespacefoo aufgelöst. Wenn der Code, der foo verwendet, global ist und keinen Code in einem Namespace enthält, wird foo als foo aufgelöst. Warnung: Wenn eine Funktion oder Konstante im Namespace undefiniert ist, wird der unqualifizierte Funktions- oder Konstantenname in einen globalen Funktions- oder Konstantennamen aufgelöst.
Qualifizierter Name oder ein Name, der ein Präfix enthält, wie z. B. $a = new subnamespacefoo(); oder subnamespacefoo::staticmethod();. Wenn der aktuelle Namespace currentnamespace ist, wird foo in currentnamespacesubnamespacefoo aufgelöst. Wenn der Code, der foo verwendet, global ist und der Code in keinem Namespace enthalten ist, wird foo in den Subnamespacefoo aufgelöst.
Vollständig qualifizierter Name oder ein Name, der einen globalen Präfixoperator enthält, zum Beispiel $a = new currentnamespacefoo(); oder currentnamespacefoo::staticmethod();. In diesem Fall wird foo im Code immer in den Literalnamen currentnamespacefoo aufgelöst.
Das Folgende ist ein Beispiel für die Verwendung dieser drei Methoden:
file1.php:
<?php namespace Foo\Bar\subnamespace; const FOO = 1; function foo() {} class foo { static function staticmethod() {} } ?>
file2.php:
<?php namespace Foo\Bar; include 'file1.php'; const FOO = 2; function foo() {} class foo { static function staticmethod() {} } /* 非限定名称 */ foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。 echo FOO; // resolves to constant Foo\Bar\FOO /* 限定名称 */ subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,以及类的方法 staticmethod echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO /* 完全限定名称 */ \Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo \Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO ?>
Hinweis Um auf eine globale Klasse, Funktion oder Konstante zuzugreifen, können Sie einen vollständig qualifizierten Namen verwenden, z. B. strlen() oder Exception oder INI_ALL.
Beispiel #1 Zugriff auf globale Klassen, Funktionen und Konstanten innerhalb eines Namespace
<?php namespace Foo; function strlen() {} const INI_ALL = 3; class Exception {} $a = \strlen('hi'); // 调用全局函数strlen $b = \INI_ALL; // 访问全局常量 INI_ALL $c = new \Exception('error'); // 实例化全局类 Exception ?>