PHP5.4 此次更新的关键新特性,包括:新增traits,更精简的Array数组语法,供测试使用的内建webserver,可以闭包使用的$this指针,实例化类成员访问,
PHP 5.4.0 性能大幅提升, 修复超过100个bug. 废除了register_globals, magic_quotes以及安全模式。 另外值得一提的是多字节支持已经默认启用了,default_charset从ISO-8859-1已经变为UTF-8. 默认发送“Content-Type: text/html; charset=utf-8”,你再也不需要在HTML里写meta tag,也无需为UTF-8兼容而传送额外的header了。
Traits
Traits (横向重用/多重继承)是一组结构很像“类”(但不能实例化)的方法,它可以让开发人员在不同的类中轻松地重用方法。 PHP为单继承语言,子类只能继承一个父类,于是Traits来了。
1、Traits的最佳应用是多类之间可以共享相同的函数。打个比方,我们要做个网站,需要使用Facebook和Twitter的APIs。我们要建 2个类,如果是以前,我们需要写一个cURL的方法并且复制/粘贴到两个类中。现在不用了,使用Traits重用代码吧,这次真正地遵循了 DRY(Don’t Repeat Yourself)原则。
/** cURL wrapper trait */trait cURL{ public function curl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); return $output; }}/** Twitter API Class */class Twitter_API{ use cURL; // use trait here public function get($url) { return json_decode($this->curl('http://api.twitter.com/'.$url)); }}/** Facebook API Class */class Facebook_API{ use cURL; // and here public function get($url) { return json_decode($this->curl('http://graph.facebook.com/'.$url)); }}$facebook = new Facebook_API();echo $facebook->get('500058753')->name; // Rasmus Lerdorf/** Now demonstrating the awesomeness of PHP 5.4 syntax */echo (new Facebook_API)->get('500058753')->name;$foo = 'get';echo (new Facebook_API)->$foo('500058753')->name;echo (new Twitter_API)->get('1/users/show.json?screen_name=rasmus')->name;
看明白了吗?没有?那你来瞅瞅更简单的例子
2、优先级:当前类中的方法会覆盖 Trait 方法,而Trait方法覆盖了基类中的方法。
sayHello();//output Hello Universe!?>
3、多个Traits,使用use声明列出多个Traits。
sayHello();$o->sayWorld();$o->sayExclamationMark();//output Hello World!?>
4、冲突的解决:为了解决两个 Traits 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定冲突方法中的一个。由于这仅允许排除一个方法,as 操作符可以将冲突的方法以另一个名称来引入。
?>
以上的smallTalk()都会输出b,bigTalk()会输出A。
5、修改方法可见性:使用的类可以通过 as 语法来调整方法的可见性
6、Traits组:其他 traits 也能够使用 traits,正如类能够使用 traits。 在 trait 定义时通过使用一个或多个 trait,它能够组合其他 traits 中的部分或全部成员。
sayHello();$o->sayWorld();?>
上面会输出Hello world!
7、抽象成员:为了对使用的类施加强制要求,Trait 支持抽象方法的使用。
getWorld(); } abstract public function getWorld();}class MyHelloWorld { private $world; use Hello; public function getWorld() { return $this->world; } public function setWorld($val) { $this->world = $val; }}?>
8、Traits静态成员:静态变量可以被 trait 的方法引用,但不能被 trait 定义。但是 traits 能够为使用的类定义静态方法。
Example #9 静态变量
inc(); // echo 1$p = new C2(); $p->inc(); // echo 1?>
Example #10 静态方法
9、属性:如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误。 如果类的定义是兼容的(同样的可见性和初始值)则错误的级别是 E_STRICT
,否则是一个致命错误。
x;?>
下面的例子出现了冲突
Buid-in web server
PHP5.4内置了一个简单的Web服务器,这样在做一些简单程序就方便多了,省去了环境配置的工作,特别对于初学者来说。把当前目录作为Root Document只需要这条命令即可:
$ php -S localhost:3300
也可以指定其它路径:
$ php -S localhost:3300 -t /path/to/root
还可以指定路由:
$ php -S localhost:3300 router.php
Short array syntax
PHP5.4提供了数组简短语法:
$arr = [1,'james', 'james@fwso.cn'];
Array dereferencing
这个可是个好东西, 有了Array dereferencing, 以前的这种写法就再也不必要了:
$arr = myfunc();echo $arr[1];
在PHP5.4中这样就行了:
echo myfunc()[1];
Upload progress
Session提供了上传进度支持,通过$_SESSION["upload_progress_name"]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。
参考:
JsonSerializable Interface
实现了JsonSerializable接口的类的实例在json_encode序列化的之前会调用jsonSerialize方法,而不是直接序列化对象的属性。参考:Use mysqlnd by default
现在mysql, mysqli, pdo_mysql默认使用mysqlnd本地库,在PHP5.4以前需要:
$./configure --with-mysqli=mysqlnd
现在
$./configure --with-mysqli
完成。