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