当前位置: 首页 > 后端技术 > PHP

PHP命名空间

时间:2023-03-29 21:09:42 PHP

*支持命名空间的版本:PHP5>5.3.0、PHP7。什么是命名空间广义上讲,命名空间是一种封装事物的方式。这种抽象可以在很多地方看到。例如,目录在操作系统中用于对相关文件进行分组,它充当目录中文件的名称空间。例如,文件foo.txt可以同时存在于/home/greg和/home/other目录下,但两个foo.txt文件不能存在于同一目录下。另外,访问/home/greg目录外的foo.txt文件时,必须在文件名前加上目录名和目录分隔符,才能得到/home/greg/foo.txt。将这一原则应用到编程领域就是命名空间的概念。在PHP中,命名空间用于解决在编写类库或应用程序时创建类或函数等可重用代码时遇到的两类问题:用户编写的代码与PHP内部类/函数/常量或第三方类之间的名称冲突/功能/常量。为非常长的标识符名称(通常定义为缓解第一类问题)创建别名(或简称),提高源代码的可读性。PHP名称空间提供了一种将相关的类、函数和常量组合在一起的方法。定义命名空间命名空间是用关键字命名空间声明的。声明命名空间的语句必须是文件中的第一条语句,除了一个:declare关键字。声明命名空间之前唯一合法的代码是定义源文件编码方式的声明语句。此外,包括空格在内的所有非PHP代码不得出现在名称空间声明之前。同一个命名空间可以定义在多个文件中,这样就可以将同一个命名空间的内容划分到不同的文件中。namespaceMyProject;constCONNECT_OK=1;classConnection{/*...*/}functionconnect(){/*...*/}?>类似于目录的层次结构,命名空间也支持指定层次命名空间名称。上面的例子创建了常量MyProjectSubLevelCONNECT_OK,classMyProjectSubLevelConnection和函数MyProjectSubLevelconnect。PHP也支持在同一个文件中定义不同的命名空间,但是不推荐这种用法,这里就不多说了。在这里我有一个问题。它说名称空间定义必须是文件中代码的第一行。不是说一个文件定义了多个命名空间不在第一行吗?我测试了这个问题。对于包含多个命名空间的文件,所有的代码都必须在某个命名空间下,否则会报Fatalerror:Nocodemayexistoutsideofnamespace{}inError,对于全局代码,把它放在全局命名空间里,比如这个命名空间{}使用命名空间PHP命名空间中的元素可以通过三种方式引用,以类名为例:非限定名,或者不带前缀的类名,如$a=newfoo();或foo::staticmethod();。如果当前命名空间是currentnamespace,foo将被解析为currentnamespacefoo。如果使用foo的代码是全局的,代码不包含在任何命名空间中,那么foo将被解析为foo.警告:如果命名空间中的函数或常量未定义,则未限定的函数或常量名称将解析为全局函数或常量名称。有关详细信息,请参阅使用命名空间:后备全局函数名称/常量名称。限定名称,或包含前缀的名称,例如$a=newsubnamespacefoo();或subnamespacefoo::staticmethod();。如果当前命名空间是currentnamespace,那么foo将解析为currentnamespacesubnamespacefoo。如果使用foo的代码是全局的,代码不包含在任何命名空间中,foo将被解析为子命名空间foo。完全限定名称,或包含全局前缀运算符的名称,例如$a=newcurrentnamespacefoo();或currentnamespacefoo::staticmethod();。在这种情况下,foo在代码中总是解析为字面名称(literalname)currentnamespacefoo。NAMESPACE常量__NAMESPACE__常量的值是一个包含当前命名空间名称的字符串。在全局代码中,不包含在任何名称空间中,它包含一个空字符串。namespace关键字namespace关键字可用于显式访问当前命名空间或子命名空间中的元素。它相当于类中的self运算符。使用命名空间所有支持命名空间的PHP版本都支持三种别名或导入方式:对类名使用别名,对接口使用别名,或对命名空间名称使用别名。PHP5.6开始允许导入函数或常量或为它们设置别名。在PHP中,别名是通过运算符use.namespacefoo;useMy\Full\ClassnameasAnother;//下面的例子和useMy\Full\NSnameasNSname一样useMy\Full\NSname;//Import全局类useArrayObject;//导入函数(PHP5.6+)usefunctionMy\Full\functionName;//别名函数(PHP5.6+)usefunctionMy\Full\functionNameasfunc;//导入常量(PHP5.6+)使用constMy\Full\CONSTANT;$obj=newnamespace\Another;//实例化foo\Another对象$obj=newAnother;//实例化My\Full\Classname 对象NSname\subns\func();//调用函数My\Full\NSname\subns\func$a=newArrayObject(array(1));//实例化ArrayObject对象//如果没有使用“use\ArrayObject”,则实例转换为foo\ArrayObject对象func();//调用函数My\Full\functionNameechoCONSTANT;//echoesthevalueofMy\Full\CONSTANT?>```注意命名空间中的名称(包括命名空间分隔符)前导反斜杠是不必要的,不建议用于完全限定名称,如Foo\Bar和相对全局名称不包含命名空间分隔符的,如FooBar,由于导入的名称必须是完全限定的,不会根据当前命名空间进行相对解析。为了方便起见,PHP还支持单行使用多个use语句。