首页 | 联系我们 | 叶凡网络官方QQ群:323842844
游客,欢迎您! 请登录 免费注册 忘记密码
您所在的位置:首页 > 新闻中心 > 行业新闻 > 正文

名扬互联:PHP中的匿名函数的深入了解

作者:cocomyyz 来源: 日期:2014-3-5 9:45:04 人气:0 加入收藏 评论:0 标签:

个人认为和JS对闭包的支持比起来,这个实现.还是有些太简陋了PHP5.3以前,匿名函数的作用就是扩大函数的使用功能。传送Callback方式,只有俩种选择:

◆字符串的函数名

◆使用create_funct返回

多了一个选择,PHP5.3以后.也就是Closur

$func=function{...};

$func;array_walk$arr.

第一种方式:传送函数名字符串是最简单的而第二种方式create_function,从实现上来说.其实和第一种方式实质上一样的,create_funct返回一个字符串的函数名,这个函数名的格式是:

"\000_lambda_".countanonymous_funct++

来看看create_funct实现方法:

函数体;.获取参数;拼凑一个"function__lambda_func参数){函数体;}"字符串;eval,找不到就出错;通过__lambda_func函数表中找到eval后得到函数体;定义一个函数名:"\000_lambda_".countanonymous_funct++;用新的函数名替换__lambda_func;返回新的函数。

来验证下:

<?php

'echo__FUNCTION__;'; create_funct"".

1; call_user_func"\000lambda_1".

?>

//输出

__lambda_fun

函数名是__lambda_func,因为在eval时候.所以匿名函数内会输出__lambda_func,而因为最后用”\000_lambda_.countanonymous_funct++重命名了函数表中的__lambda_func函数,所以可通过”\000_lambda_.countanonymous_funct++调用这个匿名函数。为了证实这一点,可以将create_funct返回值dump进去检查。

其中有一条newfeatur就是支持闭包/LambdaFunction,而在PHP5.3发布的时候.第一反应是以为zval新增了一个IS_FUNCTION,但实际上是构造了一个PHP5.3引入的Closur类”实例,Closur类的构造函数是私有的,所以不能被直接实例化,另外Closur类是Final类,所以也不能做为基类派生子类.

//php-5.3.0

$class=newReflectionClass"Closure";

var_dump$class->isIntern;

var_dump$class->isA bstract;

var_dump$class->isFin;

var_dump$class->isInterfac;

//输出:

booltrue

boolfals

booltrue

boolfals

?>

也仅仅是把要保持的外部变量,而PHP5.3中对闭包的支持.做为Closur对象的Static属性”并不是普通意义上的可遍历/访问的属性).

//php-5.3.0

$b="laruence";

$func=function$aus$b{};

var_dump$func;

/*输出:

objectClosur#12{

["static"]=>

arrai1{

["b"]=>

string8"laruence"

}

["parameter"]=>

arrai1{

["$a"]=>

string10"<required>"

}

}

*/


本文网址:http://www.mingyangnet.com/html/hangye/1986.html
读完这篇文章后,您心情如何?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
更多>>网友评论
发表评论
编辑推荐
  • 没有资料