PHP 5.4即将到来:内置Web服务器

作者:匿名 hihi 来源:lupaworld.com 浏览: 2011-10-26 14:26:45 字号:
[摘要]PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,日前PHP5.4又放出了第一个Beta版本。PHP 的 5.4x 分支新添加了许多新的特性。

  PHP5.3刚出来不久,PHP6孕育中的同时,PHP5.4又放出了第一个Beta版本。PHP 的 5.4x 分支新添加了许多新的特性,如 mixin 语法“traits”、直接使用数组下标访问函数返回值 explode(",", "a,b,c,d,e")[3] 、方便调试用的内置 Webserver SAPI 等。其中一些特性(如 traits)将改变我们的开发方式。网上已经出现了很多对于php 5.4新特性介绍的reference,这里有一份官方的详细列表可以供参考http://svn.php.net/viewvc/php/php-src...

  PHP5.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()

的reference,这里有一份官方的详细列表可以供参考http://svn.php.net/viewvc/php/php-src...

  对于我来说,除了一些bug的修复,最值得期待的是两方面:

性能上的巨大提高

  根据一些已知的性能测试来看,对于执行速度基本可以提高一倍左右,而内存的使用则降低到上一版本的1/3到1/2。如果最终的发行版能保证这个成绩,那么不得不说这是一个巨大的提高。

新特性的引入

  我们重点关注下新增的主要几点新特性:

Traits language construct

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

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

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

  熟悉scalar的朋友都知道Traits是一个介于ClassInterface之间的东西,它是抽象的定义,但是跟接口不同的是可以包括实际的方法和成员变量,而跟abstract class不同的是,它可以是多重的!这将让php的oop特性更加丰富,不过我也悲观地认为这会让众多php的草根们对oop的概念更加混乱!

<?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
Array dereferencing support

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

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

  PHP5.4还新增了一个SAPI,这个SAPI将支持直接把PHP当做Websever使用。这对php初学者来说的好消息,那就是php 5.4会包含一个简单的server,大家不用再去烦恼如何配置apache之类的了。

    $ 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以前的版本(这个比较悲剧,如果要用,看来只能自己折腾了)。有关的更多信息,可以参看:webserver sapi

  当然此Web Server只能用于开发时使用,用于生产环境万万不行,性能不行,安全性不行。

  具体特性,参见手册:http://php.net/manual/en/features.commandline.webserver.php

  另一个我比较关心的特性是php 5.4中终于支持全类型的函数类型检测了,在php 5.3以前我们只能在类型检测中使用arrayClass的检测,比如

function foo(array input, MyClass key) {
return;
}

  但是php 5.4会支持现在php的所有内置类型了(String,Int,Float,Resource,Bool等等),这样我们就不用在函数内部写类似is_string之类的函数了。

  还有一个让无数php开发者曾经无比纠结的问题,终于在这个php 5.4中修复了(至少我认为是修复)。那就是在函数的返回值中直接使用数组键值了

function func () {
return array(1, 2, 3);
}

echo func()[1]; // 输出2

  这个看似理所当然的东西居然要等到php 5.4中才修复,要是早点修复可以节省多少变量,少排放多少二氧化碳啊。

  我所期待的特性

  php在我眼里离一个完美的语言还相差甚远,但幸好他是一个相当趁手的语言。所以我对它也有我的期待,那就是增加对服务端持久化的支持,虽然有apc cache之类的东西,但是没有语言级的解决,还是感觉到不方便。这里有一些老外对php的期许http://www.reddit.com/r/PHP/comments/...,你们自己希望有那些新特性呢?

  国内 PHP 内核大牛 laruence 也加入了 PHP 开发组,并参与了 PHP 5.4 的改进。

sssss
Tags: php5.4   php   webservser   php内置web server  
责任编辑:190
编辑推荐排行