当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP5.3新特性:名称空间(Namespaces)

PHP
需要发散思维学习PHP
php 图片上添加透明度渐变的效果
php 图片上传类代码
PHP 生成的XML以FLASH获取为乱码终极解决
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
PHP DataGrid 实现代码
MayFish PHP的MVC架构的开发框架
PHP 实现多服务器共享 SESSION 数据
PHP 开源框架22个简单简介
PHP 数组遍历顺序理解
PHPLog php 程序调试追踪工具
PHP 分页类(模仿google)-面试题目解答
火车头discuz6.1 完美采集的php接口文件
Discuz 6.0+ 批量注册用户名
使用php来实现网络服务
火车采集器 免费版使出收费版本功能实现原理
php程序之die调试法 快速解决错误
PHP 日常开发小技巧
PHP下通过系统信号量加锁方式获取递增序列ID
php 代码优化的42条建议 推荐

PHP5.3新特性:名称空间(Namespaces)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 199 ::
收藏到网摘: n/a

之前陆续介绍了php 5.3的一些新特性,正好上周看到ZendCon关于5.3的ppt,介绍的更为详细,那么这里做个归总或者说翻译:)

Namespaces

php 5.3最大的改动,毫无疑问就是Namespaces(此前有一篇相关的PHP Namespaces FAQ)。这给php开发人员带来的好处不少,广为人们所诟病的函数命名问题也得到了解决。

代码更清晰

5.3之前常见的代码,需要自定义前缀区分函数和类名

CODE:

function MY_wrapper() {}
class MY_DB { }
define('MY_CONN_STR', '');
MY_wrapper();
new MY_DB();
MY_CONN_STR;

使用名称空间之后,代码看上去更加clean。

CODE:

namespace MY;
function wrapper() {}
class DB { }
const CONN_STR = '';
use MY AS MY;
wrapper();
new DB();
CONN_STR;

一个文件中定义了多个namespace

如果一个文件中定义了多个namespace,应该怎样处理?

CODE:

namespace LIB;
class MySQL {}
class SQLite {}
$b = new SQLite();
namespace LIB_EXTRA;
class MScrypt {}
$a = new MScrypt();
var_dump(
        get_class($a),
        get_class($b)
);

以上代码输出为:

CODE:

string(18) "LIB_EXTRA::MScrypt"
string(11) "LIB::SQLite"

php是解释执行的语言,以上结果合情合理。

namespace的优先级

namespace中定义的函数,类和常量优先,其次才是全局的。

CODE:

namespace foo;
function strlen($foo) { return htmlentities($foo); }
echo strlen("test"); // test
echo ::strlen("test"); // 4
echo namespace::strlen("test"); // test

namespace和autoload的友情

autoload会根据namespace名称以及class名称来解析类文件位置

仅当namespace和全局范围都没找到class定义的情况下,autoload才会被触发

在namespace中定义的__autoload不会被自动调用

CODE:

function __autoload($var) { var_dump($var); } // LIB::foo
require "./ns.php"; /*
        <?php
                namespace LIB;
                new foo();
*/

namespace一些辅料

CODE:

namespace really::long::pointlessly::verbose::ns; 
__NAMESPACE__; // 新增的魔法常量,表示当前namespace名称
class a{}  
get_class(new a()); // really::long::pointlessly::verbose::ns::a
use really::long::pointlessly::verbose::ns::a AS b; // 从名称空间中引用一个类

注:这里的内容节选自pdf Introduction to PHP 5.3 Slides,后文不再复述。