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关键字:
在PHP中有很多可以使用回调函数的函数,比如array_map,array_walk, 我一直很郁闷的就是, 对于这样的函数,我必须要先定义个回叫函数,然后将回叫函数的字符串函数名作为参数传递,对于我这样的一个追求代码漂亮的人来说,我对这种方式简直可以说是深恶痛绝。
所以,在以前,我一直都是使用create_function来创建匿名函数, 可是用create_function的时候,函数体,参数都必须以字符串的方式传入,这样语法高亮就不能被应用,导致代码还是很ugly。
今天,我终于等到了PHP的Lamdba…
首先,让我们先用一个例子,来试试:
在PHP5.3的特性介绍中,也说明了,对于一个包含lambda函数的变量来说,可以有3种调用方式:
另外,对于匿名函数来说,最重要的伴随物就应该是闭包了(closure), PHP5.3中也同样支持了闭包,这样,我们就可以使用这个特性,来创建一些流程相同,但是数据并不完全的函数族,举个简单的例子:
当我们var_dump lambda函数的时候,会得到如下结果:
在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对象。
TrackBack URI:
5.3是有很多重大的改进和BUG修改.
回复
恩,每个新的版本都会有对以前版本的bug的修改的作用的么,:)
回复
Lambda functions指的是什么呢?
回复
简单来说lambda functions就是说函数体被赋值给一个变量的函数, 这个名字应该是源于Lisp/Scheme语言中的lambda(匿名函数):
(define func (lambda(p) (+ 1 p)));
在js中也很常见:
var func = function(e){ return;};
恩, 插一句,想起来有人说过,js是一个披着C语言皮的Lisp.
回复
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:
May 10th, 2009 at 8:27 pm
你的知识面也是很广啊? 呵呵
留个MSN或者其他的联系方式吧? 以后多多请教。。
回复