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中session登录页面的应用
Jul 25 PHP
PHP教程 预定义变量
Oct 23 PHP
PHP print类函数使用总结
Jun 25 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
PHP魔术方法__GET、__SET使用实例
Nov 25 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
PHP数组和explode函数示例总结
May 08 PHP
php操作memcache缓存方法分享
Jun 03 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
php注册和登录界面的实现案例(推荐)
Oct 24 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
用js做一个小游戏平台 (一)
2009/12/29 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
如何提高数据访问速度
2016/12/26 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
Python实现拼接多张图片的方法
2014/12/01 Python
Python最长公共子串算法实例
2015/03/07 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
计算机专业自我鉴定
2013/10/15 职场文书
劳动之星获奖感言
2014/02/01 职场文书
面试自我评价范文
2014/09/17 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
升学宴答谢词
2015/01/05 职场文书
西游记读书笔记
2015/06/25 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL