什么是命名空间?
根据 PHP.NET 官方翻译文档描述, 命名空间是这样定义的:
什么是命名空间? 从广义上来说, 命名空间是一种封装事物的方法.
在 PHP 中, 命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
(1), 用户编写的代码与 PHP 内部的类 / 函数 / 常量或第三方类 / 函数 / 常量之间的名字冲突.
(2)为很长的标识符名称 (通常是为了缓解第一类问题而定义的) 创建一个别名 (或简短) 的名称, 提高源代码的可读性.
这个描述太官方, 不太好懂.
简单地说, 这个命名空间, 就是用来解决定义的常量, 函数和类, 存在重名的问题, 一是解决用户定义的类 / 函数 / 常量与 PHP 内部的类 / 函数 / 常量同名的问题, 二是解决不同软件开发小组或不同软件公司定义的类 / 函数 / 常量同名的问题, 而你需要同时使用这两个公司定义的类库.
比如, 新冠肺炎防控期间, Ahcme 学校开发了用于收集学生疫情报告的信息的软件平台, AnHui 省也开发了省级疫情监测平台, 用于汇总各高校疫情信息进行大数据分析和预警. 现在, 由 Wisedu 公司来做这个对接开发, 用于将 ahcme 学校的填报明细数据每天定时上传到省级疫情平台.
在 Wisedu 公司开始做对接工作之前, Ahcme 学校和 Anhui 省都已经基本完成了代码开发, 他们有了下面的 PHP 代码文件:
Achme 学校的代码是 ahcme_sample.PHP 文件:
Anhui 省的代码是 anhui_sample.PHP 文件:
这两个单位的代码都定义了同样名字的常量, 函数和类, 但具体的实现细节是不一样的. 现在 wisedu 公司要做的事情就是要将 ahcme 的学生信息转换成 anhui 省监控平台所需要的数据格式, 以便进行数据上报.
Wisedu 公司写了下面的测试代码(test.PHP):
这样带来一个问题, 调用 hello 函数和实例化 Student 对象, 我不知道是使用的是 ahcme 学校的代码, 还是 anhui 省的代码. 更严重的是, 运行会报错:
这是一个严重错误(Fatal error), 提示是不能重复定义 hello 函数. 当然也会遇到类 Student 不能重复定义.
怎么解决这个问题呢? 那就是给 ahcme 学校和 anhui 省的代码, 定义在不同的命名空间里面.
如何定义命名空间?
使用 namespace 关键字定义命名空间.
namespace 语句必须是 PHP 文件中<?PHP 标记下的第 1 个语句(declare 语句除外).
顶级命名空间是 \, 接下来是一级命名空间, 二级命名空间, 他们之间用 \ 分隔.
如 \ ncov2019\ahcme 就是一个二级命名空间, 是 ncov2019 命名空间的子命名空间.
Achme 学校的代码是 ahcme_sample.PHP 文件:
Anhui 省的代码是 anhui_sample.PHP 文件:
这里使用的是二级子命名空间, 可以认为这两个单位的项目都是新冠肺炎防控 (ncov2019) 这个项目的子项目. 当然你也可以使用一级命名空间(如 anhui 和 ahcme), 这由这几个开发小组共同协商好就行.
不建议在一个 PHP 文件中定义多个命名空间.
这个时候, wisedu 公司的测试代码就可以这样写:
这里, test.PHP 没有定义命名空间, 那他是顶级命名空间 \. 那么当前命名空间就是 \.
这样, 就能很清楚的知道,$s1 对象是 ahcme 学校的学生,$s2 对象是 anhui 省的大学生了. 运行结果也是这样:
当然, 作为 wisedu 公司的代码, 他也可以定义命名空间:
这时, 当前命名空间就是 ncov2019\wisedu 了. 不能再像这样去定义 ahcme 的 Student 对象了:
$s1 = newncov2019\ahcme\Student("11001", "张三");
因为上面是相对路径的定法. 以前当前命名空间是 \, 转换成绝对路径是 \ ncov2019\ahcme\Student 对象, 是正确的. 现在当前命名空间是 ncov2019\wisedu, 转换成绝对路径就是 \ ncov2019\wisedu\ncov2019\ahcme\Student 对象, 当然就不正确了, 所以要用绝对路径来使用 Student 对象:
$s1 = new\ncov2019\ahcme\Student("11001", "张三");
给命名空间起个别名
上面的命名空间 \ ncov2019\wiseduncov2019\ahcme 名字太长, 经常写的话就很费事, 所以打算用个短点的名字, 如 ahcme. 这是可以使用 use 关键字来给命名空间起个别名:
除了可以使用 use 语句给命名空间起别名, 也可以给常量, 函数, 类名起个别名:
总之, 命名空间就是用来解决不同软件开发团队间常量 / 函数 / 类的同名问题. 如果遇不到命名冲突问题, 完全可以不使用命名空间.
另外, PHP 的命名空间是从 5.3 版本才开始的, 从个人感觉来看, 他的命名空间解决机制没有 Java 和. NET 的丰富和灵活. 从总体来看, PHP 没有多少如淘宝, YouTube 等大型项目的应用, 他的主要应用还是在于中小型项目的快速构建, 所以, 它在一些复杂项目的管理支持上还是要欠缺一些.
有问题, 请在下方评论区留言.
(2020.3.14 0:48 by whitewin)
什么是命名空间?
根据 PHP.NET 官方翻译文档描述, 命名空间是这样定义的:
什么是命名空间? 从广义上来说, 命名空间是一种封装事物的方法.
在 PHP 中, 命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
(1), 用户编写的代码与 PHP 内部的类 / 函数 / 常量或第三方类 / 函数 / 常量之间的名字冲突.
(2)为很长的标识符名称 (通常是为了缓解第一类问题而定义的) 创建一个别名 (或简短) 的名称, 提高源代码的可读性.
这个描述太官方, 不太好懂.
简单地说, 这个命名空间, 就是用来解决定义的常量, 函数和类, 存在重名的问题, 一是解决用户定义的类 / 函数 / 常量与 PHP 内部的类 / 函数 / 常量同名的问题, 二是解决不同软件开发小组或不同软件公司定义的类 / 函数 / 常量同名的问题, 而你需要同时使用这两个公司定义的类库.
比如, 新冠肺炎防控期间, Ahcme 学校开发了用于收集学生疫情报告的信息的软件平台, AnHui 省也开发了省级疫情监测平台, 用于汇总各高校疫情信息进行大数据分析和预警. 现在, 由 Wisedu 公司来做这个对接开发, 用于将 ahcme 学校的填报明细数据每天定时上传到省级疫情平台.
在 Wisedu 公司开始做对接工作之前, Ahcme 学校和 Anhui 省都已经基本完成了代码开发, 他们有了下面的 PHP 代码文件:
Achme 学校的代码是 ahcme_sample.PHP 文件:
Anhui 省的代码是 anhui_sample.PHP 文件:
这两个单位的代码都定义了同样名字的常量, 函数和类, 但具体的实现细节是不一样的. 现在 wisedu 公司要做的事情就是要将 ahcme 的学生信息转换成 anhui 省监控平台所需要的数据格式, 以便进行数据上报.
Wisedu 公司写了下面的测试代码(test.PHP):
这样带来一个问题, 调用 hello 函数和实例化 Student 对象, 我不知道是使用的是 ahcme 学校的代码, 还是 anhui 省的代码. 更严重的是, 运行会报错:
这是一个严重错误(Fatal error), 提示是不能重复定义 hello 函数. 当然也会遇到类 Student 不能重复定义.
怎么解决这个问题呢? 那就是给 ahcme 学校和 anhui 省的代码, 定义在不同的命名空间里面.
如何定义命名空间?
使用 namespace 关键字定义命名空间.
namespace 语句必须是 PHP 文件中<?PHP 标记下的第 1 个语句(declare 语句除外).
顶级命名空间是 \, 接下来是一级命名空间, 二级命名空间, 他们之间用 \ 分隔.
如 \ ncov2019\ahcme 就是一个二级命名空间, 是 ncov2019 命名空间的子命名空间.
Achme 学校的代码是 ahcme_sample.PHP 文件:
Anhui 省的代码是 anhui_sample.PHP 文件:
这里使用的是二级子命名空间, 可以认为这两个单位的项目都是新冠肺炎防控 (ncov2019) 这个项目的子项目. 当然你也可以使用一级命名空间(如 anhui 和 ahcme), 这由这几个开发小组共同协商好就行.
不建议在一个 PHP 文件中定义多个命名空间.
这个时候, wisedu 公司的测试代码就可以这样写:
这里, test.PHP 没有定义命名空间, 那他是顶级命名空间 \. 那么当前命名空间就是 \.
这样, 就能很清楚的知道,$s1 对象是 ahcme 学校的学生,$s2 对象是 anhui 省的大学生了. 运行结果也是这样:
当然, 作为 wisedu 公司的代码, 他也可以定义命名空间:
这时, 当前命名空间就是 ncov2019\wisedu 了. 不能再像这样去定义 ahcme 的 Student 对象了:
$s1 =newncov2019\ahcme\Student("11001","张三");
因为上面是相对路径的定法. 以前当前命名空间是 \, 转换成绝对路径是 \ ncov2019\ahcme\Student 对象, 是正确的. 现在当前命名空间是 ncov2019\wisedu, 转换成绝对路径就是 \ ncov2019\wiseduncov2019\ahcme\Student 对象, 当然就不正确了, 所以要用绝对路径来使用 Student 对象:
$s1 =new\ncov2019\ahcme\Student("11001","张三");
给命名空间起个别名
上面的命名空间 \ ncov2019\wiseduncov2019\ahcme 名字太长, 经常写的话就很费事, 所以打算用个短点的名字, 如 ahcme. 这是可以使用 use 关键字来给命名空间起个别名:
除了可以使用 use 语句给命名空间起别名, 也可以给常量, 函数, 类名起个别名:
总之, 命名空间就是用来解决不同软件开发团队间常量 / 函数 / 类的同名问题. 如果遇不到命名冲突问题, 完全可以不使用命名空间.
另外, PHP 的命名空间是从 5.3 版本才开始的, 从个人感觉来看, 他的命名空间解决机制没有 Java 和. NET 的丰富和灵活. 从总体来看, PHP 没有多少如淘宝, YouTube 等大型项目的应用, 他的主要应用还是在于中小型项目的快速构建, 所以, 它在一些复杂项目的管理支持上还是要欠缺一些.
有问题, 请在下方评论区留言.
(2020.3.14 0:48 by whitewin)
来源: https://www.cnblogs.com/whitewin/p/12490597.html