Press "Enter" to skip to content

PHP5.4的新特性

PHP5.3刚出来不久, PHP6孕育中的同时, PHP5.4又放出了第一个alpha版本.
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, 那么你就不需要担心这些问题, 它是一种组合方式, 你提供的素材, 无论在任何地方都是自我一个整体.

 <?php
 trait SayWorld {
   public function sayHello() {
     echo 'Hello World!';
   }
 }
 class MyHelloWorld extends Base {
   use SayWorld;
 }
 $o = new MyHelloWorld();
 $o->sayHello(); // Hello World

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

 <?php
 class Base {
   public function sayHello() {
     echo 'Hello ';
   }
 }
 trait SayWorld {
   public function sayHello() {
     parent::sayHello();
     echo 'World!';
   }
 }
 class MyHelloWorld extends Base {
   use SayWorld;
 }
 $o = new MyHelloWorld();
 $o->sayHello(); // echos Hello World

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

Array dereferencing support

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

<?php
    list($name,) = explode(",", "Laruence, male");
?>

取而代之的是:

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

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

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

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

<?php
function &ref(&$arr) {
    return $arr;
}
$arr = array(1,2,3);
ref($arr)[4] = 4;
var_dump($arr);
?>

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

16 Comments

  1. poweredbytian
    poweredbytian December 24, 2014

    上面的那个名字点不开网站 重新评论一下 误删。
    Traits language construct 不错。

  2. 暴走档案
    暴走档案 October 8, 2014

    Array dereferencing support
    这个特性很是喜欢,以前分割。都是在数组里面取,现在就没有那么麻烦了。

  3. qq头像
    qq头像 March 9, 2013

    这些改进都不错.php越来越完善了.但是目前的大部分的版本还是5.2左右

  4. 雪候鸟
    雪候鸟 April 6, 2012

    @忙碌的刘小忙 PHP的参数是弱类型, PHP支持可变参数, 缺省参数, 为啥还需要重载呢?

  5. 忙碌的刘小忙
    忙碌的刘小忙 April 6, 2012

    PHP5 以后的版本,支持方法重载吗?

  6. gan
    gan November 1, 2011

    非常好,期待正式版发布

  7. KnightE
    KnightE July 8, 2011

    traits运用的好可以让很多模式实现得更加优雅、轻量,当然用的不好也会破坏很多OO的封装。好与坏本身和traits无关。

  8. C
    C July 7, 2011

    不喜欢Traits
    webserver sapi是个好东西, 可以配合HMTL中的WebSocket

  9. string lau
    string lau July 4, 2011

    trait MemcachedPolicy {
    void setCache($name, $value)
    { … }
    }
    trait MySqlCachePolicy {
    void setCache($name, $value)
    { … }
    }
    trait Singleton {
    static $instance = array();
    public static function getInstance() {
    !isset($instance[static]) &&
    $instance[static] = new static
    }
    return $instance[static]
    }
    class CacheService {
    use $this->config->cachePolicy;
    use Singleton;
    }
    new CacheService()->setCache($name, $value);
    CacheService::getInstance()->setCache($name, $value);
    期待5.4正式版能支持这些。。

  10. TonySeek
    TonySeek July 3, 2011

    Traits language construct 真是让人激动的特性,和 ruby 的 yield block 很像~

  11. jaceju
    jaceju July 2, 2011

    這版似乎沒有把 array 簡寫語法 (也就是以方括號來初始化陣列) 放進去?

  12. syber
    syber July 2, 2011

    session移除了好多,对以前程序是不是不兼容了(有使用到session_registered()的地方)?
    webserver sapi是个好消息啊!新特性可以在以后的项目中尝试。

Leave a Reply to poweredbytian Cancel reply

Your email address will not be published. Required fields are marked *