以下是自己读PHP手册命名空间这一节的一些笔记,还有自己上机做命名空间测试的一些整理,原创博客,有错欢迎指正:

 

 1、命名空间声明必须是第一条语句,若没有声明命名空间的脚本,则被认为是全局空间的脚本。若某个类、函数、常量和系统自带的相应元素重名,则此时需要用命名空间区分(用户自定义的重名问题当然也需要用命名空间来区分),区分后,全局空间下的相应元素即表示系统自带元素。

2三种名称

1)非限定名称:不带任何前缀的类、函数、常量名。这种引用会被解读为引用在当前命名空间中的类、函数、常量。

对于函数常量若当前命名空间(如\ns1\ns2)找不到,则解读为引用全局空间中该名的函数或常量。

对于,若在当前命名空间中找不到该类,则尝试自动加载当前命名空间下的该类(加载\ns1\ns2\class),仍找不到则报错 。

2)限定名称:引用的元素带了命名空间前缀(如sns\element),被解读为当前命名空间(仍例如\ns1\ns2)下的引用命名空间元素(\ns1\ns2\sns\element)。注意,限定名称规则对use无效,即在命名空间ns1use ns2\sns;此时ns1中直接sns\element会被解释为ns2\sns\element而非ns1\sns\element(这是没use时情况)。总之涉及到use都是完全限定的。

 

对于函数常量,若在当前命名空间找不到,则报错,不会解读为引用全局空间元素。

对于,则尝试自动加载当前命名空间下的该限定名称类(加载\ns1\ns2\sns\element)。

3)完全限定名称:也即包含了全局前缀(“\”)的名称,从全局空间逐层找到相应元素。在动态名称中的类、函数、常量都被解读为全局空间中的元素。

3、可以用use来引用某个命名空间下的元素函数常量,需要先将命名空间php文件requireInclude进来才能use,还可以结合as为引用的元素起一个别名。注意use中的命名空间路径被解读为完全限定的,不需要在最前面加全局操作符“\”。

注意命名空间中的requireinclude,比如在空间ns1require了一个空间为ns2php,表示在全局空间下引入了ns2这个命名空间,并不是在ns1下引入了ns2子空间,若要引入ns1ns2的子空间,require进来的php的命名空间必须声明为ns1\ns2。也就是说namespace声明的命名空间都是完全限定名称的。

 

posted on 2018-01-06 15:39  SHQHDMR  阅读(133)  评论(0编辑  收藏  举报