霜天部落 | 专注PHP研发,研究LAMP高性能架构部署与优化

PHP 5.4的新特性

PHP5.3刚出来不久,PHP6孕育中的同时,PHP5.4又放出了第一个alpha版本。

PHP 5.4主要包括以下特性:

Added: Traits language construct
Added: Array dereferencing support
Added: DTrace support
Improved: Improved Zend Engine memory usage and performance
Moved: ext/sqlite moved to pecl (sqlite3 support is still built-in)

Removed: break/continue $var syntax
Removed: register_globals, allow_call_time_pass_reference, and register_long_arrays ini options
Removed: session_is_regisitered(), session_registered(), and session_unregister()

我们重点关注下新增的这三点:

Traits language construct

Traits不是什么新概念了,c++,java都有类似的东西,只不过这次PHP也引入了进来。

Traits是一种轻量级的方法复用(相对继承来说)。为什么这么说呢? 这就好比,如果你提供一个基类供用户去继承使用,那么不可避免的你就需要考虑如何能让用户继承后可用, 如何避免用户改写了某些关键属性,覆盖了某些关键方法而造成出错。这个时候你就要考虑改用public还是private,或者protected,你还要考虑,那个方法应该申明为FINAL。

而如果使用Traits,那么你就不需要担心这些问题,它是一种组合方式,你提供的素材,无论在任何地方都是自我一个整体。

     sayHello(); // Hello World

Trait和继承以及当前类的同名函数之间的冲突,有一套固定的解决方案,也就是当前类的方法覆盖Trait的同名方法,而Trait中的方法,覆盖基类的同名方法。比如:

     sayHello(); // echos Hello World

更多关于Traits的信息,请参考: Traits for PHP RFC

Array dereferencing support

这个可是个好东西,有了Array dereferencing,以前的这种写法就再也不必要了:

    

取而代之的是:

      $name = explode(",", "Laruence,male")[0];

另外,据Cataphrac介绍,Array derefencing也可以出现再赋值语句的左值中,也就是理论上你可以这么写:

    explode(",", "Laruence, male")[3] = "phper";

但也许有朋友会问这个有什么意义么? 呵呵,当时我也对Cataphrac提出了这样的疑问,不过后来了解到,还是有一些场景可以用到的,比如你先需要调用一个函数做初步处理,然后对处理结果进行调整:

    

DTrace support

DTrace是一个性能分析工具,可以跟踪出函数调用点,返回点等数据,对于这个我也不是很了解,感兴趣的同学可以参看PHP 5.3.99-DEV AND DTRACE PART I

Webserver SAPI

最后,PHP5.4还新增了一个SAPI,这个SAPI将支持直接把PHP当做Websever使用:

    $ php -S localhost:8000 test.php
    //output:
    PHP Development Server is listening on localhost:8000 in foo/ 。。。 Press Ctrl-C to quit。

这个特性真的很让我兴奋,因为在差不多半个月以前,我就和我的几个同事探讨过,是否可以做一个类似东西,来减少Webserver这一层。

不过,和philip沟通得知,这个新的SAPI,错过了alpha1版本,应该会在下个测试版,和最终版中放出来,也不支持直接patch到php5.4以前的版本(这个比较悲剧,如果要用,看来只能自己折腾了)。有关PHP Webserver SAPI的更多信息,可以参看:webserver sapi

作者: Laruence url: http://www.laruence.com/2011/07/02/2097.html