Dieses Mal werde ich Ihnen eine detaillierte Erklärung der Verwendung des PHP-Namespace und der Vorsichtsmaßnahmen bei der Verwendung des PHP-Namespace geben. Nehmen wir das Folgende als Beispiel ein Blick.
Durch Namespaces gelöste Probleme (das Handbuch ist auch sehr klar geschrieben und das Folgende ist nach meinem eigenen Verständnis vereinfacht):
1: Lösen Sie die Probleme von Klassen, Konstanten, Funktionen usw ist ein Namenskonflikt innerhalb von PHP oder einem Dritten.
2: Erstellen Sie Aliase, um das Problem zu langer Namen von Klassen, Konstanten und Funktionen zu lösen und die Lesbarkeit des Codes zu verbessern. Darüber hinaus werden zu lange Namen normalerweise durch die Abschwächung des ersten verursacht Art des Problems.
1: Der Namespace wird mit dem Schlüsselwort namespace deklariert. Gleichzeitig muss sich der Namespace vor anderem Code befinden, einschließlich jeglichem Nicht-PHP-Code und Leerzeichen (PHP-Deklarationsschlüsselwörter), andernfalls wird ein schwerwiegender Fehler ausgegeben.
Zum Beispiel:
<?php namespace Index; ?>
Hinweis 1: Wenn vor dem Namespace kein Code oder Leerzeichen vorhanden ist, aber dennoch ein schwerwiegender Fehler auftritt, sollte dies durch den BOM-Header verursacht werden. Entfernen Sie ihn Die Stückliste. Gehen Sie einfach weiter.
Hinweis 2: Obwohl der gesamte legale PHP-Code unter dem Namespace platziert werden kann, sind die einzigen Klassen (abstrakte Klassenund Merkmale) und Schnittstellen, Konstanten und Funktionen, die vom Namespace betroffen sind.
2: Ähnlich wie die Beziehung zwischen Verzeichnissen und Dateien ermöglichen Ihnen PHP-Namespaces auch die Angabe hierarchischer Namespace-Namen. Daher können Namespace-Namen hierarchisch definiert werden, getrennt durch .
Zum Beispiel:
<?php namespace Index\Col\File; define('MESSAGE','hello world'); ?>
3: In einer Datei können mehrere Namespaces definiert werden. Es gibt zwei Definitionssyntaxen, eine ist eine einfache Kombinationssyntax und die andere ist eine geschweifte Klammersyntax Die Verwendung einer anderen Datei, die mehrere Namespaces definiert, ist normalerweise ein Szenario, in dem mehrere Dateien in einer Datei zusammengeführt werden. Es ist jedoch am besten, dies nicht zu tun, es sei denn, es ist absolut notwendig, da es die Komplexität des Codes erhöht und die Lesbarkeit im Allgemeinen verringert Für diese Verwendung besteht keine Notwendigkeit.
Einfache Kombinationssyntax:<?php namespace Index; const INSTANCE=1; namespace Col; const INSTANCE=2; ?>
<?php /*命名空间Index*/ namespace Index{ const INSTANCE=1; } /*命名空间Col*/ namespace Col{ const INSTANCE=2; } /*全局非命名空间代码*/ namespace { const INSTANCE=3; } ?>
<?php /*全局非命名空间代码*/ namespace { const INSTANCE=1; function test(){ echo 1; } class foo{ static function fool(){ echo 1; } } var_dump(INSTANCE); //打印出来的是1 test(); //输出1 foo::fool(); //输出1 } /*命名空间Index*/ namespace Index{ const INSTANCE=2; function test(){ echo 2; } class foo{ static function fool(){ echo 2; } } var_dump(INSTANCE); //打印出来的是2 test(); //输出2 foo::fool(); //输出2 } /*命名空间Col*/ namespace Col{ const INSTANCE=3; function test(){ echo 3; } class foo{ static function fool(){ echo 3; } } var_dump(INSTANCE); //打印出来的是3 test(); //输出2 foo::fool(); //输出2 } ?>
<?php /*全局非命名空间代码*/ namespace { const INSTANCE=1; function test(){ echo 1; } class foo{ static function fool(){ echo 1; } } var_dump(INSTANCE); //打印出来的是1 test(); //输出1 foo::fool(); //输出1 } /*命名空间Index*/ namespace Index{ var_dump(INSTANCE); //打印出来的是1 test(); //输出1 foo::fool(); //fatal error } ?>
所处命名空间\前缀限定\名称来读取,如果该代码是全局没有命名空间的,则直接用前缀限定名称来读取,也就是:前缀限定\名称来读取。
实例代码:
<?php /*命名空间Col\Index*/ namespace Col\Index{ const INSTANCE=1; } /*命名空间Index*/ namespace Index{ const INSTANCE=2; } /*命名空间Col*/ namespace Col{ const INSTANCE=3; var_dump(Index\INSTANCE); //打印出来的是1 读取的是Col\Index\INSTANCE } /*全局非命名空间代码*/ namespace { const INSTANCE=4; var_dump(Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE } ?>
②全局限定前缀名称:也就是在最左侧有全局操作符\进行修饰的前缀限定名称,当然也可以没有前缀限定直接全局操作符\加上名称也是可以的。但加上全局操作符后就跟目录里的绝对路径一样,只会按照全局限定后的所设置的进行读取。
具体实例如下:
<?php /*命名空间Col\Index*/ namespace Col\Index{ const INSTANCE=1; } /*命名空间Index*/ namespace Index{ const INSTANCE=2; } /*命名空间Col*/ namespace Col{ const INSTANCE=3; var_dump(\Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE } /*全局非命名空间代码*/ namespace { const INSTANCE=4; var_dump(\Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE } namespace Lin{ const INSTANCE=5; var_dump(\INSTANCE); //打印出来的是4 读取的是INSTANCE,是全局非命名空间里的INSTANCE,如果没有全局操作符\,读取的会是当前命名空间的Lin\INSTANCE=5 } ?>
有时候命名空间会放在字符串中使用,如果是单引号不会通过编译器解释,所以没有任何问题,但是如果是双引号,那么就会有些意外情况了,要知道双引号里的内容是需要经过编译器进行解释然后再进行输出的,而\在编译器里的解释容易造成歧义。
例如"index\name"这里就有\n会被解释成换行,除此之外还有很多这种造成意外的情况。
因此一般我们推荐命名空间如果要放在字符串中使用,最好使用单引号,一是效率,二是安全,如果使用双引号,则必须增加一个\进行转义避免歧义,例如"index\\name"这样就没有问题了。
随手双引号的举个例子:
<?php /*全局非命名空间代码*/ namespace Index\Name{ class foo{ function construct(){ echo 2; } } } namespace{ $a= "Index\\Name\\foo"; //用\转义了\所以可以正常运行,但是如果去掉转义的话会报错Class 'Index\Nameoo',因为/f被解释成了换页符 $obj=new $a; }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung des PHP-Namespace. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!