以下是自己读PHP手册命名空间这一节的一些笔记,还有自己上机做命名空间测试的一些整理,原创博客,有错欢迎指正:
1、命名空间声明必须是第一条语句,若没有声明命名空间的脚本,则被认为是全局空间的脚本。若某个类、函数、常量和系统自带的相应元素重名,则此时需要用命名空间区分(用户自定义的重名问题当然也需要用命名空间来区分),区分后,全局空间下的相应元素即表示系统自带元素。
2、三种名称:
(1)非限定名称:不带任何前缀的类、函数、常量名。这种引用会被解读为引用在当前命名空间中的类、函数、常量。
对于函数或常量,若当前命名空间(如\ns1\ns2)找不到,则解读为引用全局空间中该名的函数或常量。
对于类,若在当前命名空间中找不到该类,则尝试自动加载当前命名空间下的该类(加载\ns1\ns2\class),仍找不到则报错 。
(2)限定名称:引用的元素带了命名空间前缀(如sns\element),被解读为当前命名空间(仍例如\ns1\ns2)下的引用命名空间元素(\ns1\ns2\sns\element)。注意,限定名称规则对use无效,即在命名空间ns1中use ns2\sns;此时ns1中直接sns\element会被解释为ns2\sns\element而非ns1\sns\element(这是没use时情况)。总之涉及到use都是完全限定的。
对于函数或常量,若在当前命名空间找不到,则报错,不会解读为引用全局空间元素。
对于类,则尝试自动加载当前命名空间下的该限定名称类(加载\ns1\ns2\sns\element)。
(3)完全限定名称:也即包含了全局前缀(“\”)的名称,从全局空间逐层找到相应元素。在动态名称中的类、函数、常量都被解读为全局空间中的元素。
3、可以用use来引用某个命名空间下的元素(类或函数或常量,需要先将命名空间php文件require或Include进来才能use),还可以结合as为引用的元素起一个别名。注意use中的命名空间路径被解读为完全限定的,不需要在最前面加全局操作符“\”。
注意命名空间中的require和include,比如在空间ns1中require了一个空间为ns2的php,表示在全局空间下引入了ns2这个命名空间,并不是在ns1下引入了ns2子空间,若要引入ns1下ns2的子空间,require进来的php的命名空间必须声明为ns1\ns2。也就是说namespace声明的命名空间都是完全限定名称的。