php命名空间设计思想、用法与缺点分析


Posted in PHP onJuly 17, 2019

本文实例讲述了php命名空间设计思想、用法与缺点。分享给大家供大家参考,具体如下:

相比C#等语言,你可以在php函数里面随意定义变量并赋值,而不用担心覆盖了全局变量,或者类变量;你也可以随意的定义类变量,而不用担心会和函数名冲突,因为变量前面都有个$。

php的命名空间和全局变量、局部变量的设计思想一样,都是为了尽可能的减少命名冲突。php的命名空间可以和文件系统类似,有相对命名空间和绝对命名空间。

定义命名空间

必须是第一个语句,前面不能有任何语句,注释可以。
必须是绝对命名空间。

namespace bookrpg\config;
//或者
namespace bookrpg\config
{
}
namespace \bookrpg\config; //错误,不能有前导\

导入命名空间

必须是绝对命名空间。

use bookrpg\config\ClassName;
use \bookrpg\config\ClassName; //可以有前导\,但不建议加
use bookrpg\config\ClassName as NewClassName;
use Exception;
use \Exception; //可以有前导\,但不建议加

使用命名空间

使用绝对命名空间

$cls = new \bookrpg\config\ClassName();
class MyException extends \Exception
{
}

使用相对命名空间

namespace bookrpg
{
  //等同于new \bookrpg\config\ClassName();
  $cls = new config\ClassName();
  //错误,php会认为是\bookrpg\Exception,而不是全局类Exception
  $ex = new Exception();
}

怪异的地方

C++、Java、C#都有相似的命名空间概念,而php的命名空间不跟随大流,有自己的一套独立的思想,对于先入为主的人来来说就显得怪异和令人迷惑。

  1. 命名空间中居然有反斜杠?

    点号(.)已经被用作字符串连接符了,又要区分绝对和相对命名空间,new .a.b.c()太不美观,所以选择反斜杠吧。

  2. 一旦使用了命名空间,使用全局类也要加上“\”或者use一下,累不累呀?

    没办法,为了严格类比文件系统的概念,也为了随便定义类名,而不用担心类名冲突。

  3. 既然是严格类比文件系统,为什么定义和导入命名空间的时候,前面不加\呢?

    只能说,php的设计者不是完美主义者。

但php的命名空间确实缺乏逻辑完美性:

  • 前导\的使用不统一,同样是绝对命名空间,定义的时候不允许用,导入的时候却允许用。
  • 即使是全局类,在非全局命名空间下,也必须使用前导\,而全局函数和变量又不受此限制。

使用建议

  • 定义和导入命名空间的时候,统一不加前导\
  • 所有的类都使用use导入,包括全局类,只命名空间类,有冲突的就as一下
  • 禁止直接使用相对命名空间

理解了php命名空间的设计思想,并避免其设计不完美的地方,这样看来php的命名空间也是很容易接受的。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
PHP微框架Dispatch简介
Jun 12 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 PHP
php之curl设置超时实例
Nov 03 PHP
PHP实现阳历到农历转换的类实例
Mar 07 PHP
对PHP依赖注入的理解实例分析
Oct 09 PHP
PHP 实现浏览记录并按日期分组
May 11 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
PHP count_chars()函数讲解
Feb 14 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 PHP
PHP实现简易图形计算器
Aug 28 PHP
php和C#的yield迭代器实现方法对比分析
Jul 17 #PHP
php基于协程实现异步的方法分析
Jul 17 #PHP
php学习笔记之字符串常见操作总结
Jul 16 #PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 #PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 #PHP
php array_chunk()函数用法与注意事项
Jul 12 #PHP
laravel框架中间件 except 和 only 的用法示例
Jul 12 #PHP
You might like
PHP抽象类 介绍
2012/06/13 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
Prototype Function对象 学习
2009/07/12 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
js实现登录验证码
2016/12/22 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
Python解析树及树的遍历
2016/02/03 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
python操作链表的示例代码
2020/09/27 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
Weblogc domain问题
2014/01/27 面试题
《最后的姿势》教学反思
2014/02/27 职场文书
如何写股份合作协议书
2014/09/11 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技