PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
命名空间概述
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
PHP命名空间提供了一种将相关的类、函数和常量组合到一起的途径。下面是一个说明PHP命名空间语法的示例:
定义命名空间
虽然任意合法的PHP代码都可以包含在命名空间中,但只有三种类型的代码受命名空间的影响,它们是:类,函数和常量。命名空间通过关键字namespace来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。当然你也可以在同一个文件中定义多个命名空间。
namespaceMyProject; classMyClass { #code... }
定义子命名空间:与目录和文件的关系很象,PHP命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
namespaceMyProject\helper\http; classMyClass { #code... }
在同一个文件中定义多个命名空间:在同一个文件中声明多个命名空间有两种方式,不过在实际编程实践中,非常不提倡在同一个文件中定义多戈命名空间。这种方式的主要用于将多个PHP脚本合并在同一个文件中。下面列出第一种方法。
namespaceMyProject\helper\http; classMyClass { #code... } namespaceMyProject\helper\request; classMyClass { #code... }
不过强烈不建议使用这种方法,可以参考下面的大括号定义法:
namespaceMyProject\helper\http; { classMyClass { #code... } } namespaceMyProject\helper\request; { classMyClass { #code... } }
PHP命名空间中的元素使用
在讨论如何使用命名空间之前,必须了解PHP是如何知道要使用哪一个命名空间中的元素的。类名可以通过三种方式引用:
非限定名称,或不包含前缀的类名称,例如$a=newfoo();或foo::staticmethod();。如果当前命名空间是currentnamespace,foo将被解析为currentnamespace\foo。如果使用foo的代码是全局的,不包含在任何命名空间中的代码,则foo会被解析为foo。警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。详情参见使用命名空间:后备全局函数名称/常量名称。
限定名称,或包含前缀的名称,例如$a=newsubnamespace\foo();或subnamespace\foo::staticmethod();。如果当前的命名空间是currentnamespace,则foo会被解析为currentnamespace\subnamespace\foo。如果使用foo的代码是全局的,不包含在任何命名空间中的代码,foo会被解析为subnamespace\foo。
完全限定名称,或包含了全局前缀操作符的名称,例如,$a=new\currentnamespace\foo();或\currentnamespace\foo::staticmethod();。在这种情况下,foo总是被解析为代码中的文字名(literalname)currentnamespace\foo。
使用命名空间:别名/导入
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。PHP命名空间支持有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。在PHP中,别名是通过操作符use来实现的。
注意PHP不支持导入函数或常量。
namespacefoo; useMy\Full\ClassnameasAnother;
//下面的例子与useMy\Full\NSnameasNSname相同 useMy\Full\NSname;
//导入一个全局类 use\ArrayObject;