什么是命名空间?

根据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 = new ncov2019\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 = new ncov2019\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)

关于PHP命名空间的讨论的更多相关文章

  1. Google开发规范

    v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件   ...

  2. Google's C++ coding style

    v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件   ...

  3. Linux和Windows设备驱动架构比较

    毕业后一直在学操作系统, 有时候觉得什么都懂了,有时候又觉得好像什么都不懂,但总体来说自认为对操作系统实现机制的了解比周围的人还是要多一些.去年曾花了几个星期的晚上时间断断续续翻译了这篇对Linux和 ...

  4. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  5. PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则

    PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...

  6. [Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

    Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...

  7. php命名空间

    命名空间概述 (PHP 5 >= 5.3.0, PHP 7) 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分 ...

  8. XML Schema命名空间解析

    URI Web中汇集了各种资源.资源可以是具有标识的任何事物, 如文档. 文件. 菜单项. 计算机. 服务等, 甚至可以包括人. 组织和概念[BernersLee 1998].在Web体系结构中, ...

  9. yii2 如何用命名空间方式使用第三方类库

    原文地址:http://www.yiichina.com/tutorial/395 Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利 ...

随机推荐

  1. Linux SSH 使用密钥登陆

    Linux SSH 使用密钥登陆 通常我们登录 Linux 服务器,我们需要使用密码进行登录,但是密码存在被暴力破解的可能. 可以将默认服务端口 22 改成其他不常用的端口. 可以设置非常复杂的密码. ...

  2. Win7如何查看nvidia显卡(GPU)的利用率

    1.在文件夹C:\Program Files\NVIDIA Corporation\NVSMI里找到文件nvidia-smi.exe2.把该文件拖到命令提示符窗口(win+R,再输入‘CMD’进入), ...

  3. 以elasticsearch-hadoop 向elasticsearch 导数,丢失数据的问题排查

    实际这是很久之前的问题了,当时没时间记录 这里简单回顾 项目基于 数据架构不方便说太细,最精简的 somedata-> [kafka]->spark-stream->elastics ...

  4. 3dmax2017卸载/安装失败/如何彻底卸载清除干净3dmax2017注册表和文件的方法

    3dmax2017提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dmax2017失败提示3dmax2017安装未完成,某些产品无法安装,也有时候想重新安装3 ...

  5. mysql 数据库 创建用户和授权

    创建用户和密码 CREATE USER '用户名'@'%' IDENTIFIED BY '密码'; 创建几个数据库 例如 db1,db2 用户授权访问指定的数据库 grant all privileg ...

  6. servlet简单概括总结

    最近在看java web的相关内容,不管是整体还是细节,要学习的知识有很多,所以有一个好的学习体系非常重要.在阅读学习一些博客和教程中关于servlet的内容后,现将知识体系和自己的总结体会进行梳理, ...

  7. a, b = a, a+b 和a=b b=a+b的区别

    n,a,b=0,0,1 while n<5: print(b) a,b=b,a+b n=n+1 和 n,a,b=0,0,1 while n<5: print(b) a=b b=a+b n= ...

  8. docker 使用:创建nginx容器

    在上一节中了解了镜像和容器.对于镜像可以这样的理解,镜像相当于一个光盘,里面刻录了一个系统这个系统已经带有相关的服务了. 容器是通过镜像这个光盘安装的一个操作系统,光盘预加了什么服务,容器就有什么服务 ...

  9. Luogu_1966_火柴排队

    题目描述 涵涵有两盒火柴,每盒装有\(n\)根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2 ...

  10. 醉酒驾驶VS睡眠不足,哪个更危险

    在全球范围内,睡眠不足驾驶每年导致成千上万起交通事故,醉酒驾驶就更不用说了.毫无疑问,两种情况下都不应该驾车,都有危险.睡眠不足和醉酒驾驶相对来说哪个更危险呢? 如果要问哪一个"好" ...