PHP高级学习中命名空间的基本用法分析
本文说明了命名空间在PHP高级学习中的基本用法。分享给大家参考,如下:
前言
在编程语言中,命名空间是范围的一种特殊抽象,它表示标识符的可见范围。一个标识符可以在多个名称空间中定义,它在不同名称空间中的含义是不相关的。这样,任何标识符都可以在新的名称空间中定义,并且它们不会与任何现有的标识符冲突,因为现有的定义在其他名称空间中。
PHP中还有名字空间的使用,控制可见范围的标识符一般指的是类和函数。
首先,PHP命名空间基础
广义地说,名称空间是封装事物的一种方式。这个抽象的概念在很多地方都能找到。比如PHP的类名不能重复,但往往我们需要引入一些第三方类库,而且往往类名在项目中会有重复的冲突,所以命名空间就是解决这种冲突的一种方式。
PHP5.3之后引入了名字空间的概念,即同一个名字空间中的类名不能重复,同名的类可以存在于不同的名字空间中。
这样,在引入第三方类库时,只有当每个类库的名称空间不同时,才不会有冲突。
所以根据官方的说法,在PHP中,在编写类库或应用程序时,在创建类或函数等可重用代码时,使用名称空间来解决两种问题:
1.用户编写的代码与PHP中的类/函数/常量或第三方类/函数/常量之间的名称冲突。2.为长标识符名称创建一个别名(或简称),以提高源代码的可读性。
应该指出的是:
同一文件下可以存在多个命名空间;不同命名空间中的类可以相互调用。
第二,PHP命名空间的用法
1.定义
命名空间由关键字命名空间定义,其定义如下:
命名空间示例,此命名空间下的所有类都属于此命名空间,并且示例命名空间下的类不能同名。
或者,您可以定义多个级别的名称空间:
在命名空间示例\test\demo中,命名空间下的所有类都属于示例\test\demo命名空间。
已定义的命名空间可以使用_ _ NAMESPACE_ _ magic变量来获取当前命名空间。
2.介绍
使用关键字use引入命名空间,您可以通过多种用途将多个命名空间引入文件:
使用示例;使用示例\测试\演示;如果您需要使用任何命名空间的类和方法,请使用命名空间,前提是包含这些命名空间的实际文件地址,或者可以实现自动类加载。
3.实例化
实例化使用程序中某个命名空间下的class方法,也可以使用new关键字进行实例化,但是需要在类名前加上命名空间前缀。
例如:
$class=新示例\ a();//实例化类a $class=示例命名空间下的新示例\ test \ demo \ b();//在示例\test\demo命名空间下实例化类b。如果在文件前面引入了这些名称空间,那么类的前缀是不必要的:
使用示例;使用示例\测试\演示;$ class=new a();//实例化示例命名空间下的类a $ class=new();//在示例\test\demo命名空间下实例化类b。注意:如果使用是使用示例\测试;然后在实例化类B时带来相对的命名空间路径(注意不是实际的文件路径),即new demo \ B();
当然,所有实例化都可以直接使用绝对路径形式,即在命名空间前面添加\字符,如new \ example \ test \ demo \ b();因此,B类以绝对路径的形式被实例化。
4.别名
使用命名空间定义命名空间时,为了避免以后引用时命名空间太长,可以在定义命名空间时使用as关键字为其指定别名
命名空间示例\test\demo作为testDemo这样,以后引用或者实例化的时候,就可以新建testDemo\类名();
Iii .基于PSR4的命名空间规范
由于不同项目中方法和类的命名空间定义不一致,第三方类库的命名空间定义也不一致,相关php组织发布了一套既定的规范,即PSR4规范。
用于标准化命名空间的定义规则。
具体规格如下:
1.完整的类名必须具有以下结构:
\命名空间(\子命名空间)* \类名1。完整的类名必须有顶级命名空间,称为“供应商命名空间”;2.一个完整的类名可以有一个或多个子命名空间;3.完整的类名必须有最终的类名;4.完整类名任何部分的滑线都没有特殊含义;5.完整的类名可以由任意大小写字母组成;6.所有类名必须区分大小写。
2.当根据完整的类名加载相应的文件时,
(1).在完整的类名中,去掉前面的命名空间分隔符,前面一个或多个连续的命名空间和子命名空间作为“命名空间前缀”,必须至少对应一个“文档基目录”;(2).紧接在命名空间前缀之后的子命名空间必须与相应的“文件基目录”匹配,其中命名空间分隔符将用作目录分隔符。(3)末尾的类名。必须与相应的文件具有相同的名称。php后缀。(4)自动加载器的实现一定不能抛出异常,一定不能触发任何级别的错误信息,不应该有返回值。
看起来很复杂。事实上,规范的要点是命名空间的路径应该对应于当前文件的路径,这规定了所有项目命名空间的定义标准,尽管PHP官方并不这样做
强制的,但是现在许多开源项目已经按照惯例使用了,这使得在命名空间下找到类的路径变得很容易。
比如文件目录a/b/c中有d.php,当A目录中的文件引入D的类时,应该是使用b/c或者使用/A/b/c;(绝对路径形式)
第四,注意要点
1.代码重用类Trait也符合命名空间的规范,即Trait类在命名空间下不能同名;2.虽然PSR4规定了命名空间路径对应文件路径,但是在运行php时,命名空间路径和文件路径并没有关系。比如a/b/c下的文件类D可以写成a1/B1/C1/D;然而,现在许多开源框架在实现类的自动加载时将两者标准化以保持一致。否则,会有加载类文件但不加载命名空间的情况。3.在命名空间中,所有未根据导入规则进行转换的限定名都将位于当前命名空间名称之前。例如,如果在命名空间A\B内部调用C\D\e(),C\D\e()将被转换为A\B\C\D\e()。4.在命名空间内部(例如,A\B),具有非限定名称的函数调用在运行时被解析。例如,对函数foo()的调用解析如下:(1)在当前命名空间中找到名为A\B\foo()的函数;(2)尝试在全局空间中查找并调用函数foo()。5.在运行时解析对命名空间(例如,A\B)中的非限定名或限定名类(不完整的限定名)的调用。以下是调用新C()和新D\E()的解析过程:解析新C () :(1)在当前命名空间中查找A\B\C类。(2)尝试自动加载A\B\C类。
以上内容是指PSR4文件的地址:http://www.php-fig.org/psr/psr-4/
更多对PHP相关内容感兴趣的读者可以查看本网站的话题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》、0103010。
希望本文对PHP编程有所帮助。
版权声明:PHP高级学习中命名空间的基本用法分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。