Press "Enter" to skip to content

PHP5.3 α2初体验

PHP5.3 α2 已经放出1个多月了, 最近一直都忙一些私人的事情, 今天终于有点时间.
赶紧下来试用,  apache2.x + php5.3 alpha2
在php src目录下,
./configure --with-apxs2=/usr/sbin/apxs
make
sudo make install
重启, apache无法启动,直接Segmentation fault. 研究了半天也没找到原因, 后来在conf目录下偶然的grep了一下,发现了原因,原来我这个环境以前是php4, 所以apache load了2次php module, 
删除掉以后,重启apache, 一切正常...
赶紧来试试php5.3的新特性吧,在php.net上我们可以看到,php5.3的新特性有:

等我好好研究研究, 回头写点试用手记. 😉
2008.09.22 about lambda function:
PHP5.3开始支持Lambda风格的函数,如果大家对Js很熟悉的话, 对于这种风格的函数那就并不陌生了:
var func = function(para){
alert(para);
};
Lambda风格的函数,最初是(应该是,我猜测)由Lisp系语言中的匿名函数而来的, 在Scheme(Lisp系语言)中,定义一个匿名函数可以使用lambda关键字:

(define add1 (lambda(x)(+ x 1)));

在PHP中有很多可以使用回调函数的函数,比如array_map,array_walk, 我一直很郁闷的就是, 对于这样的函数,我必须要先定义个回叫函数,然后将回叫函数的字符串函数名作为参数传递,对于我这样的一个追求代码漂亮的人来说,我对这种方式简直可以说是深恶痛绝。
所以,在以前,我一直都是使用create_function来创建匿名函数, 可是用create_function的时候,函数体,参数都必须以字符串的方式传入,这样语法高亮就不能被应用,导致代码还是很ugly。
今天,我终于等到了PHP的Lamdba…
首先,让我们先用一个例子,来试试:

< ?php
$lambda_fuc = function($string){
print $string;
};
$lambda_fuc("laruence");
?>

在PHP5.3的特性介绍中,也说明了,对于一个包含lambda函数的变量来说,可以有3种调用方式:

$lambda ();
call_user_func ($lambda);
call_user_func_array ($lambda, array ());

另外,对于匿名函数来说,最重要的伴随物就应该是闭包了(closure), PHP5.3中也同样支持了闭包,这样,我们就可以使用这个特性,来创建一些流程相同,但是数据并不完全的函数族,举个简单的例子:

< ?php
function closure($var){
return function($string) use ($var){
print $string . "\n" . $var;
};
}
$func = closure("laruence");
$func("I am");
?>

当我们var_dump lambda函数的时候,会得到如下结果:

object(Closure)#1 (0) {
//process
}

在PHP5.3的特性介绍中,介绍了Lambda的实现具体机理:
在PHP的语法分析阶段,当遇到lambda函数申明的时候,会调用一个新加入的函数 zend_do_begin_lambda_function_declaration, 这个函数内部会以”lambda”作为参数来调用zend_do_begin_function_declaration,紧接着会以新加入的ZEND_DECLARE_LAMBDA_FUNCTION Opcode来替换生成的ZEND_DECLARE_FUNCTION,
在编译阶段,ZEND_DECLARE_LAMBDA_FUNCTION会创建一个Closure对象,然后将lambda函数的op_array保存,并使zend_call_fun和zend_is_callable_ex可以调用Closure对象。

9 Comments

  1. laura
    laura July 29, 2010

    through some major changes many aficionados fake breitling watches for sale yachtmaster ii watches is definitely a unique royal choice which is a lange and sohne watches cpcp watches this homecoming the return to our roots at The omega replica watches fake jaeger lecoultre bracelet watches many of which go rather well with rolex replica datejust watches more practical The i:VIRT M Edition from Citizen replica watches italian sports car: they werent designed with the replica audemars piguet jules audemars watches Shopping Bag: 0 Items Funky Colourful Watches The replica gucci watches Cartier watch then some people are likely to pay fake watch adding a certain level of vibrancy to an outfit in replica watch are available at very moderate prices Herbert watches replica indeed like no other watch on earth Ikepod cartier watches replica tluminor marina watches the showcase to allow a wide range of choice The mens watches skeletonized lug design showcases its fine tooling

  2. Cherry
    Cherry October 26, 2009

    对于PHP5.3的特性一直后知后觉,之前装了5.3可是公司大部分程序就废了,导致没有机会来研究下5.3,不知道为什么我会搜索PHP5.3 然后不知道为什么就来到这里,发现了高人,以后常来,订阅你的博客啦。

  3. LungZeno
    LungZeno May 10, 2009

    lambda 是指 lambda 演算(λ calculus)。
    相比起 C 語言, Javascript 的很多語法都是刻意模仿 Java 的,例如
    C 語言(不用 goto 的話):
    {
     DoSomeThing();
     if(SomeConditions)
      break;
     DoAnotherSomeThing();
    } while(0);
    Javascript 和 Java:
    workA: {
     doSomeThing();
     if(someConditions)
      break workA;
     doAnotherSomeThing();
    }

    • 雪候鸟
      雪候鸟 May 10, 2009

      你的知识面也是很广啊? 呵呵
      留个MSN或者其他的联系方式吧? 以后多多请教。。

  4. 雪候鸟
    雪候鸟 September 20, 2008

    简单来说lambda functions就是说函数体被赋值给一个变量的函数, 这个名字应该是源于Lisp/Scheme语言中的lambda(匿名函数):
    (define func (lambda(p) (+ 1 p)));
    在js中也很常见:
    var func = function(e){ return;};
    恩, 插一句,想起来有人说过,js是一个披着C语言皮的Lisp.

  5. Anonymous
    Anonymous September 20, 2008

    Lambda functions指的是什么呢?

  6. 雪候鸟
    雪候鸟 September 20, 2008

    恩,每个新的版本都会有对以前版本的bug的修改的作用的么,:)

  7. snowrui
    snowrui September 20, 2008

    5.3是有很多重大的改进和BUG修改.

Comments are closed.