之前陆续介绍了php5.3的一些新特性
,正好上周看到ZendCon关于5.3的ppt
,介绍的更为详细,那么这里做个归总或者说翻译:)
Namespaces
php5.3最大的改动,毫无疑问就是Namespaces(此前有一篇相关的
PHPNamespacesFAQ)
。这给php开发人员带来的好处不少,广为人们所诟病的函数命名问题也得到了解决
。 代码更清晰
5.3之前常见的代码,需要自定义前缀区分函数和类名
PLAINTEXT
CODE:
functionMY_wrapper(){}
classMY_DB{}
define('MY_CONN_STR','');
MY_wrapper();
newMY_DB();
MY_CONN_STR;
使用名称
空间之后,代码看上去更加clean。
PLAINTEXT
CODE:
namespaceMY;
functionwrapper(){}
classDB{}
constCONN_STR='';
useMYASMY;
wrapper();
newDB();
CONN_STR;
一个文件中定义了多个namespace
如果一个文件中定义了多个namespace,应该怎样处理?
PLAINTEXT
CODE:
namespaceLIB;
classMy
SQL{}
class
SQLite{}
$b=newSQLite();
namespaceLIB_EXTRA;
classMScrypt{}
$a=newMScrypt();
var_dump(
get_class($a),
get_class($b)
);
以上代码输出为:
PLAINTEXT
CODE:
string(18)"LIB_EXTRA::MScrypt"
string(11)"LIB::SQLite"
php是解释执行的语言,以上结果合情合理。
namespace的优先级
namespace中定义的函数,类和常量优先,其次才是全局的。
PLAINTEXT
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不会被自动调用
PLAINTEXT
CODE:
function__autoload($var){var_dump($var);}//LIB::foo
require"./ns.php";/*
<?php
namespaceLIB;
newfoo();
*/
namespace一些辅料
PLAINTEXT
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,后文不再复述。
性能提升
php5.3的总体性能提升了5-15%
md5()快了10-15%
Betterstackimplementationintheengine
Constants移到read-only内存里
exception处理过程改进(简化,opcodes更少)
(require/include)_once改进,去掉重复open
Smallerbinarysize&startupsizewithgcc4
新语言特性
__DIR__
在5.3以前,为了获得当前脚本的目录,需要一次函数调用
PLAINTEXT
CODE:
echodirname(__FILE__);//<PHP5.3
在5.3,只需要一个魔术常量__DIR__就解决了。
PLAINTEXT
CODE:
echo__DIR__;//>=PHP5.3
?:操作符
便捷的?:操作符,可以从两个值/表达式中快速取得非空值。
PLAINTEXT
CODE:
$a=true?:false;//true
$a=false?:true;//true
$a=""?:1;//1
$a=0?:2;//2
$a=array()?:array(1);//array(1);
$a=strlen("")?:strlen("a");//1
__callStatic()
新增了魔术方法__callStatic,功能和__call类似,但是仅对static方法有效。
PLAINTEXT
CODE:
classhelper{
staticfunction__callStatic($name,$args){
echo$name.'('.implode(',',$args).')';
}
}
helper::test("foo","bar");//test(foo,bar)
动态调用static方法
动态的调用静态方法?动静结合。
PLAINTEXT
CODE:
classhelper{
staticfunctionfoo(){echo__METHOD__;}
}
$a="helper";
$b="foo";
$a::$b();//helper::foo
LateStaticBinding
不知道怎么译,可能留个原文更容易理解。静态方法的事件处理时机有变化,以前是在编译期处理,现在是执行期间处理。
在php5.3之前,下面的代码会输出一个A,但是这不是咱们要的,whoami方法已经在classB中重新定义,它本该输出B才符合咱们想当然的思维。
PLAINTEXT
CODE:
classA{
publicstaticfunctionwhoami(){
echo__CLASS__;
}
publicstaticfunctionidentity(){
self::whoami();
}
}
classBextendsA{
publicstaticfunctionwhoami(){
echo__CLASS__;
}
}
B::identity();//A<--PHP<5.3
下面代码中使用了static::whoami()来调用静态方法。php5.3之后,由于__CLASS__是在执行期被处理,那么这个例子中能顺利抓到classB。
PLAINTEXT
CODE:
classA{
publicstaticfunctionwhoami(){
echo__CLASS__;
}
publicstaticfunctionidentity(){
static::whoami();
}
}
classBextendsA{
publicstaticfunctionwhoami(){
echo__CLASS__;
}
}
B::identity();//B<-->=PHP5.3
mysqlnd
见
mysqlnd成为php5.3中的默认mysql驱动
但是PDO_MySQL暂时还不支持mysqlnd,目前只有mysql(i)扩展可以用到
之前介绍的php5.3的新特性,都是方便开发人员的东东。下面介绍个很讨虚拟主机提供商喜欢的特性。
增强的ini文件支持
CGI/FastCGI支持类似.htaccess的INI配置
每个目录下都可以有INI设置,ini的文件名取决于php.ini的配置,但是[PATH=/var/www/domain.com],[HOST=www.domain.com]段落的设置用户不能修改。
增强的errorhandling
允许在ini文件中定义变量和常量,可以在程序中直接调用。
附上一段ini文件的例子
PLAINTEXT
CODE:
#用户自定义的php.ini文件名(.htaccess).默认是".user.ini"
user_ini.filename=".user.ini"
#如果要禁用这个特性,设置为空值即可
user_ini.filename=
#用户自定义的php.ini文件TTL时长(time-to-live),单位为秒,我理解为缓存过期时间。默认为300秒
user_ini.cache_ttl=300
[PATH=/var/www/domain.com]
variables_order=GPC
safe_mode=1
[myvariables]
somevar=“1234”
anothervar=${somevar};anothervar==somevar
[iniarrays]
foo[bar]=1
foo[123]=2
foo[]=3