个人认为和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>"
}
}
*/