空间phpwordpress空间


PHP命名空间(namespace)是在PHP5.3中加入的,从广义上来说,命名空间是一种封装事物的方法。命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。

例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。

具体举个例子,文件foo.txt可以同时在目录/home/greg和/home/other中存在,但在同一个目录中不能存在两个foo.txt文件。

另外,在目录/home/greg外访问foo.txt文件时,我们必须将目录名以及目录分隔符放在文件名之前得到/home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

PHP命名空间(namespace)是在PHP5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。不过在PHP当中还是有着相当重要的意义。

命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。



2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

与目录和文件的关系很象,PHP命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:

上面的例子创建了常量MyProjectSubLevelCONNECT_OK,类MyProjectSubLevelConnection和函数MyProjectSubLevelConnect。



1.非限定名称,或不包含前缀的类名称,例如$a=newfoo();或foo::staticmethod();。如果当前命名空间是currentnamespace,foo将被解析为currentnamespacefoo。如果使用foo的代码是全局的,不包含在任何命名空间中的代码,则foo会被解析为foo。警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。



2.限定名称,或包含前缀的名称,例如$a=newsubnamespacefoo();或subnamespacefoo::staticmethod();。如果当前的命名空间是currentnamespace,则foo会被解析为currentnamespacesubnamespacefoo。如果使用foo的代码是全局的,不包含在任何命名空间中的代码,foo会被解析为subnamespacefoo。



3.完全限定名称,或包含了全局前缀操作符的名称,例如,$a=newcurrentnamespacefoo();或currentnamespacefoo::staticmethod();。在这种情况下,foo总是被解析为代码中的文字名(literalname)currentnamespacefoo。

注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如strlen()或Exception或INI_ALL。

PHP命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。

必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。

PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__魔术常量和namespace关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

关键字namespace可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的self操作符。

PHP命名空间支持有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量。

在PHP中,别名是通过操作符use来实现的.下面是一个使用所有可能的三种导入方式的例子:

在一个命名空间中,当PHP遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,例如:

对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP会退而使用全局空间中的函数或常量。

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与PHP引入命名空间概念前一样。在名称前加上前缀表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。



1.对完全限定名称的函数,类和常量的调用在编译时解析。例如newAB解析为类AB。



2.所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间ABC被导入为

C,那么对CDe()的调用就会被转换为ABCDe()。



3.在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间AB内部调用CDe(),则CDe()会被转换为ABCDe()。



4.非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间ABC导入为

C,则newC()被转换为newABC()。



5.在命名空间内部(例如AB),对非限定名称的函数调用是在运行时解析的。例如对函数foo()的调用是这样解析的:



6.在命名空间(例如AB)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用newC()及newDE()的解析过程:newC()的解析:newDE()的解析:为了引用全局命名空间中的全局类,必须使用完全限定名称newC()。