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 相关文章推荐
用Socket发送电子邮件(利用需要验证的SMTP服务器)
Oct 09 PHP
从网上搜到的phpwind 0day的代码
Dec 07 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
基于PHP静态类的原罪详解
May 06 PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
Jul 09 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
php-app开发接口加密详解
Apr 18 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
漂亮的thinkphp 跳转页封装示例
Oct 16 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
PHP clearstatcache()函数详解
2010/03/02 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JS中使用DOM来控制HTML元素
2016/07/31 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python中zip和unzip数据的方法
2015/05/27 Python
全面理解Python中self的用法
2016/06/04 Python
Python的标准模块包json详解
2017/03/13 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python实现飞机大战小游戏
2019/11/08 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
python实现单机五子棋
2020/08/28 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
"序列点" 是什么
2016/07/29 面试题
个人作风建设自查报告
2014/10/22 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
纪录片信仰观后感
2015/06/08 职场文书
贫困证明怎么写
2015/06/16 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS