风雪之隅
msgbartop
PHP源码分析,PHP源码研究,Zend引擎分析,Web相关技术研究,Web技术分享–左手代码 右手诗
msgbarbottom

20 Sep 08 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
< ?
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
< ?
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对象。

Related Posts:

TrackBack URI:

Tags: , ,



Reader's Comments

  1. |

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

    回复

  2. |

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

    回复

  3. |

    Lambda functions指的是什么呢?

    回复

  4. |

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

    回复

  5. |

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

    Javascript 和 Java:
    workA: {
     doSomeThing();
     if(someConditions)
      break workA;
     doAnotherSomeThing();
    }

    回复

    雪候鸟 Reply:

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

    回复



Leave a Comment

click to change Verify Code(required)click the picture to change