首页 > 编程 > PHP > 正文

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

2020-03-24 17:13:00
字体:
来源:转载
供稿:网友
之前陆续介绍了php 5.3的一些新特性,正好上周看到ZendCon关于5.3的ppt,介绍的更为详细,那么这里做个归总或者说翻译:)Namespacesphp 5.3最大的改动,毫无疑问就是Namespaces(此前有一篇相关的PHP Namespaces FAQ)。这给php开发人员带来的好处不少,广为人们所诟病的函数命名问题也得到了解决。代码更清晰5.3之前常见的代码,需要自定义前缀区分函数和类名CODE: function MY_wrapper() {}
html' target='_blank'>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,后文不再复述。html教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表