Heim >Backend-Entwicklung >PHP-Tutorial >php3, das diese Tutorials nicht haben
php.net
(PHP 5 >= 5.3.0, PHP 7)
Namespaces definieren
In einem Namespace kann zwar jeder legale PHP-Code enthalten sein, aber nur der Die folgenden Codetypen sind von Namespaces betroffen: Klassen (einschließlich abstrakter Klassen und Merkmale), Schnittstellen, Funktionen und Konstanten.
Wenn eine Datei einen Namespace enthält, muss sie den Namespace vor allen anderen Codes deklarieren, außer einem: dem Schlüsselwort „declare“. Jeglicher Nicht-PHP-Code, einschließlich Leerzeichen, darf nicht vor einer Namespace-Deklaration stehen.
<html> <?phpnamespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
Derselbe Namespace kann in mehreren Dateien definiert werden, wodurch der Inhalt desselben Namespace aufgeteilt und in verschiedenen Dateien gespeichert werden kann.
Unternamespaces definieren
<?php namespace MyProject\Sub\Level; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?>
Mehrere Namespaces in derselben Datei definieren
Hinweis: In der tatsächlichen Programmierpraxis wird dringend davon abgeraten, mehrere Namespaces in derselben Datei zu definieren Datei. Definieren Sie mehrere Namensräume in der Datei!
<?php namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } }namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ } }?>
Verwendung des Namespace
Drei Möglichkeiten, auf Klassennamen zu verweisen:
Unqualifizierter Name (ein Bezeichner, der kein Namespace-Trennzeichen im Namen enthält) oder Klasse Name ohne Präfix. Zum Beispiel $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.
Qualifizierte Namen (Bezeichner mit Namespace-Trennzeichen im Namen) oder Namen, die ein Präfix enthalten, 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.
Ein vollständig qualifizierter Name (ein Bezeichner, dessen Name ein Namespace-Trennzeichen enthält und mit einem Namespace-Trennzeichen beginnt) oder ein Name, der einen globalen Präfixoperator enthält. Um auf eine globale Klasse, Funktion oder Konstante zuzugreifen, verwenden Sie einen vollständig qualifizierten Namen, z. B. strlen() oder Exception .
Tipps:
$a = '\namespacename\classname'; $obj = new $a; $a = 'namespacename\classname'; $obj = new $a; $b = 'namespacename\funcname'; $b(); // prints namespacename\funcname$b = '\namespacename\funcname'; $b(); // also prints namespacename\funcname
Verwenden Sie verwandte Konstanten
Der Wert der Konstante __NAMESPACE__ ist eine Zeichenfolge, die den Namen des aktuellen Namespace enthält. Im globalen Code, der in keinem Namespace enthalten ist, enthält er eine leere Zeichenfolge.
Namespaces verwenden: Aliase/Importe
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 use ArrayObject; // importing a function (PHP 5.6+) use function My\Full\functionName; // aliasing a function (PHP 5.6+) use function My\Full\functionName as func; // importing a constant (PHP 5.6+) use const My\Full\CONSTANT; $obj = new namespace\Another; // 实例化 foo\Another 对象 $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象 // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象 func(); // calls function My\Full\functionName echo CONSTANT; // echoes the value of My\Full\CONSTANT ?>
Klassennamen werden immer in Namen im aktuellen Namespace aufgelöst. Daher müssen Sie beim Zugriff auf einen Klassennamen, der systemintern oder nicht in einem Namespace enthalten ist, den vollständig qualifizierten Namen verwenden.