PHP关闭是否被破坏或者我错过了什么?

时间:2010-01-01 19:21:14

标签: php closures

我一直在阅读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

那么,我错了还是?

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语句。