msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

02 Jul 11 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


分享到:



Related Posts:

Tags: , , , ,

16 Responses to “PHP5.4的新特性”

  1. PHP笔记 – 初出茅庐 |

    [...] 鸟哥 – PHP5.4的新特性 – traits [...]

  2. poweredbytian |

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

  3. poweredbytian |

    Traits language construct 不错。

  4. 暴走档案 |

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

  5. qq头像 |

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

  6. PHP+MySQL手工注入技术 | 包头黑客网络技术博客 |

    [...] PHP5.4的新特性 [...]

  7. 雪候鸟 |

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

  8. 忙碌的刘小忙 |

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

  9. gan |

    非常好,期待正式版发布

  10. Thinking In LAMP Blog » Blog Archive » PHP每月通讯(2011年8月) |

    [...] http://www.laruence.com/2011/07/02/2097.html   PHP5.4的新特性 [...]

  11. KnightE |

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

  12. C |

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

  13. string lau |

    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正式版能支持这些。。

  14. TonySeek |

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

  15. jaceju |

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

  16. syber |

    session移除了好多,对以前程序是不是不兼容了(有使用到session_registered()的地方)?

    webserver sapi是个好消息啊!新特性可以在以后的项目中尝试。

Leave a Reply

*