PHP命名空间(Namespace)简明教程


Posted in PHP onJune 11, 2014

这一特性在 PHP5.0x 时候就提出过,后来被取消并安排在 PHP6 中实现。而此次又再次“提前”到了 PHP5.3 发布,可见开发人员对其的重视以及谨慎的态度。

官方发布时说明文档的内容可能已过期(documentation maybe out dated),所以在这里简单的说明命名空间的用法:首先是声明一个命名空间,加入了新的关键字 namespace ,其应在类文件的开头

<?php   
namespace Project::Module;    
class User {       
    const STATUS_OK = true;       
    function register($data) {   
        ...       
    }   
    ...   
}?>

然后在控制器中(可能是其他文件)就可以这样调用

$user = new Project::Module::User();   
$user->register($register_info);

的确与平常的并无两样,但是我们可以将两个相互独立的类联系起来。比如
Project::Module::User;   
Project::Module::Blog;

这样就能从语言本身更容易描述和理解变量、类之间的关系,从而避免了“传统”上的 Project_Module_Blog 这样冗长的命名方式。

上面的说明可能很难说明使用命名空间带来了什么好处,新增加的 use 和 as 关键字或许能更好的说明问题。use 和 as 语句可以引用和声明 命名空间的“别名”。比如,上述的控制器中实例化类的代码可以这样写

use Project::Module;   
$user = new Module::User();    
$user->register($register_info);
 
甚至
use Project::Module::User as ModuleUser;   
$user = new ModuleUser;   
$user->register($register_info);

类中的常量也可以通过命名空间访问,比如上述类中的 STATUS_OK 就可以通过命名空间
Project::Module::User::STATUS_OK

访问。进一步的,也可以用别名简化那么长的“变量名称”
use Project::Module::User::STATUS_OK as STATUS_OK;
echo STATUS_OK;

顺便提下“超空间(The Global Namespace)”的概念。所谓的“超空间”,就是没有指定命名空间的变量、类和函数。比如
function foo() {   
    ...   
}

这的函数,可以使用 foo() 执行的同时,也可以使用 ::foo(); 这样执行。

最后,配合使用 autoload 函数即可载入指定命名空间的类。简单的函数如下

function __autoload( $classname ) {       
    $classname = strtolower( $classname );       
    $classname = str_replace( '::', DIRECTORY_SEPARATOR, $classname );   
    require_once( dirname( __FILE__ ) . '/' . $classname . '.class.php' );   
}

这样,比如调用
__autoload('Project::Module::User'); 

就可以自动载入 Project_Module_User.class.php 文件(虽然这样看起来并不方便多少)。
PHP 相关文章推荐
PHP下几种删除目录的方法总结
Aug 19 PHP
PHP编实现程动态图像的创建代码
Sep 28 PHP
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
php+mysql数据库查询实例
Jan 21 PHP
smarty模板引擎中变量及变量修饰器用法实例
Jan 22 PHP
php比较相似字符串的方法
Jun 05 PHP
php使用MySQL保存session会话的方法
Jun 26 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
PHP强制转化的形式整理
May 22 PHP
PHP APC配置文件2套和参数详解
Jun 11 #PHP
PHP捕获Fatal error错误的方法
Jun 11 #PHP
PHP独立Session数据库存储操作类分享
Jun 11 #PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 #PHP
php+ajax导入大数据时产生的问题处理
Jun 11 #PHP
CI框架中libraries,helpers,hooks文件夹详细说明
Jun 10 #PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 #PHP
You might like
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
Zend引擎的发展 [15]
2006/10/09 PHP
php 表单验证实现代码
2009/03/10 PHP
php中strtotime函数用法详解
2014/11/15 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
javascript实现yield的方法
2013/11/06 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
python Django模板的使用方法
2016/01/14 Python
Python之父谈Python的未来形式
2016/07/01 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
Pycharm Git 设置方法
2020/09/15 Python
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
Shell如何接收变量输入
2016/08/06 面试题
中软国际Java程序员笔试题
2014/07/19 面试题
银行柜员求职自荐书
2014/06/18 职场文书
安全环保演讲稿
2014/08/28 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书