我一直在阅读PHP 5.3的新功能,其中一个主要功能是闭包。
除非我非常错误,否则PHP开发人员要么: a)仅使用匿名函数来混淆闭包 b)在我正在测试的PHP 5.3.1中关闭了闭包
从what wikipedia says闭包是匿名函数的机制加上函数父元素范围变量与函数范围的绑定。最后一部分似乎在PHP中被打破了。
我已经检查过PHP错误了,奇怪的是没有发现这个错误。
以下是我的测试方法:
<?php
function getFun() {
$x = 2;
return function() {
return $x;
};
}
$f = getFun(); // getFun()(); doesn't work -.-
var_dump($f()); // $f() == null
在实际实现闭包的语言中,它返回2:
def f():
x = 2
return lambda: x
print(f()()) # prints 2
和
alert((function() {
var x = 2;
return function() {
return x;
};
})()()); // alerts 2
那么,我错了还是?
答案 0 :(得分:12)
从外部作用域继承的变量需要明确列出。来自手册:
public function getTotal($tax)
{
$total = 0.00;
$callback =
function ($quantity, $product) use ($tax, &$total)
...
答案 1 :(得分:3)
PHP的闭包实现与您习惯使用JavaScript时的预期略有不同。简单地调用function () { return x; }
将无效,因为您必须利用use
语句。