· 作者:laruence(http://www.laruence.com/)
· 本文地址: http://www.laruence.com/2008/09/20/523.html
· 转载请注明出处
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对象。
培训新闻
- 北京隆重推出“先就业,后付费”,LAMP就业班...
- 青岛PHPChina培训中心第二期就业寒假班热招
- 唐山PHPChina授权培训中心首期就业班开始热招...
- 广州多迪,零起点,四个月培养高级工程师,包...
- 济南第九期LAMP实训就业班冬节火热报名中
- 西安PCTI-5期业余班热招中......
- 上海LAMP一期实战精英班11月27日开班啦~~~~~...
- 石家庄中心6期强力推出symfony框架项目开发特...
热点专题
网站特别推荐
- LAMP兄弟连最新开班报道
- 北京隆重推出“先就业,后付费”,LAMP就业班...
- 青岛PHPChina培训中心第二期就业寒假班热招
- 唐山PHPChina授权培训中心首期就业班开始热招...
- 广州多迪,零起点,四个月培养高级工程师,包...
- PHP考试认证问题
- 大连开沅教育(PHP大连中心)12月LAMP项目实...
- 福州厦门什么时候有开培训班
- 济南第九期LAMP实训就业班冬节火热报名中
- 西安PCTI-5期业余班热招中......
社区精华
- alee简说OOP插件机制 < 未完待续 >
- mutou_wu我说PHPer的水平区分
- leehui1983MYSQL开发实用知识集合(暂告一段落...
- laruence深入理解PHP原理之文件上传
- peacock【重点推荐】一款专业级Web开发工具






最新回复
如果只是简单的函数创建, 那没有什么特别的, PHP已经有一个函数创建函数了.
重要的是支持闭包
PHP的闭包要用use引入变量吗?
好像WIKI中, 还有函数对象, 不知道, 5.3有没有支持, 有空下一个测试版试试.
但现在只是测试版, 没准正式版就给去掉了, 就像发布PHP5时, pre1之前都还有命名空间, 后来就给去掉了
我也分析过了这样做的不好处
当然,闭包对于匿名函数的重要性那是不言而喻的
恩,所以说,还是耐心的等待PHP6吧,呵呵
QUOTE:
有闭包了呀,不错~不过对php的发展方向产生了疑惑:完整的oo支持是重型语言的方向,闭包和匿名函数是轻量级脚本的特色……
php到底要干什么~
python中也有lambda,用着挺舒服的,呵呵