之前陆续介绍了php5.3的一些新特性
,正好上周看到ZendCon关于5.3的ppt
,介绍的更为详细,那么这里做个归总或者说翻译:)
Namespaces
php5.3最大的改动,毫无疑问就是Namespaces(此前有一篇相关的
PHPNamespacesFAQ)
。这给php开发人员带来的好处不少,广为人们所诟病的函数命名问题也得到了解决
。 代码更清晰
5.3之前常见的代码,需要自定义前缀区分函数和类名
CODE:
functionMY_wrapper(){}
classMY_DB{}
define('MY_CONN_STR','');
MY_wrapper();
newMY_DB();
MY_CONN_STR;
使用名称
空间之后,代码看上去更加clean。
CODE:
namespaceMY;
functionwrapper(){}
classDB{}
constCONN_STR='';
useMYASMY;
wrapper();
newDB();
CONN_STR;
一个文件中定义了多个namespace
如果一个文件中定义了多个namespace,应该怎样处理?
CODE:
namespaceLIB;
classMy
SQL{}
class
SQLite{}
$b=newSQLite();
namespaceLIB_EXTRA;
classMScrypt{}
$a=newMScrypt();
var_dump(
get_class($a),
get_class($b)
);
以上代码输出为:
CODE:
string(18)"LIB_EXTRA::MScrypt"
string(11)"LIB::SQLite"
php是解释执行的语言,以上结果合情合理。
namespace的优先级
namespace中定义的函数,类和常量优先,其次才是全局的。
CODE:
namespacefoo;
functionstrlen($foo){returnhtmlentities($foo);}
echostrlen("test");//test
echo::strlen("test");//4
echonamespace::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
namespaceLIB;
newfoo();
*/
namespace一些辅料
CODE:
namespacereally::long::pointlessly::verbose::ns;
__NAMESPACE__;//新增的魔法常量,表示当前namespace名称
classa{}
get_class(newa());//really::long::pointlessly::verbose::ns::a
usereally::long::pointlessly::verbose::ns::aASb;//从名称
空间中引用一个类
注:这里的内容节选自pdfIntroductionto
PHP5.3Slides,后文不再复述。