PHP闭包函数:为什么闭包必须是匿名函数?
lambda或匿名函数只是一个没有名字的函数。
例如
$lambda = function($a, $b) { echo $a + $b; };
闭包是一个可以访问未在其参数列表中指定的变量的函数。 在PHP 5.3+中,这些变量是在use关键字之后指定的,并且在执行闭包函数的函数定义时,通过值或通过引用进行链接。
例如
$foo = 'hello';
$closure = function() use ($foo) { echo $foo; };
$closure();
在JavaScript中,所有函数都是闭包,这是因为当函数嵌套时,存在一个作用域链,而例如最内层函数可以访问1.其局部变量,2.函数的局部变量在其封闭范围中,称为它的闭包范围,3.封闭范围的封闭范围的局部变量,被称为闭包范围的封闭范围,......等等,直到我们也可以访问N.这些全局变量在最高的范围。 在内部作用域中用var声明的变量将在外部作用域中隐藏这些变量,否则,如果内部变量与外部作用域中的变量名称相同,但未用var声明,则使用外部作用域中的变量。
var zero = 0; // global scope
function f1() {
var one = 1; // third-level closure scope of f4
function f2() {
var two = 2; // second-level closure scope of f4
function f3() {
var three = 3; // first-level closure scope of f4
function f4() {
var four = 4; // local scope of f4
console.log(zero + one + two + three + four);
}
f4();
}
f3();
}
f2();
}
f1();
这相当于下面的PHP代码:
<?php
$zero = 0; // global scope
$f1 = function() use ($zero) {
$one = 1; // third-level closure scope of f4
$f2 = function() use ($zero, $one) {
$two = 2; // second-level closure scope of f4
$f3 = function() use ($zero, $one, $two) {
$three = 3; // first-level closure scope of f4
$f4 = function() use ($zero, $one, $two, $three) {
$four = 4; // local scope of f4
echo $zero + $one + $two + $three + $four;
};
$f4();
};
$f3();
};
$f2();
};
$f1();
?>
所有这些都在这里描述。
所以,我的问题来了。 为什么PHP中的闭包必须是lambda函数? 在JavaScript中,每个函数都是闭包,但不需要是lambda函数。 那么为什么我们不能在PHP中进行以下操作?:
$foo = 'hello';
function closure() use ($foo) { echo $foo; } // PHP reports a syntax error here
closure();
(致命错误:语法错误,意外的T_USE,期待';'或'{')
链接地址: http://www.djcxy.com/p/51699.html上一篇: PHP closure functions: why does a closure have to be an anonymous function?