Are PHP closures broken or am I missing something?
I've been reading on the new features of PHP 5.3, and one of the major features are closures.
Unless I'm very badly mistaken, the PHP developers are either:
a) confusing closures with just anonymous functions b) the closures are broken in PHP 5.3.1 in which I'm testingFrom what wikipedia says closures are the mechanism of anonymous functions plus the binding of the function's parent's scope variables to the function's scope. The last part seems broken in PHP.
I've checked PHP bugs, and found nothing about this, strangely.
Here's how I'm testing:
<?php
function getFun() {
$x = 2;
return function() {
return $x;
};
}
$f = getFun(); // getFun()(); doesn't work -.-
var_dump($f()); // $f() == null
In languages that a开发者_JAVA百科ctually implement closures, it returns 2:
def f():
x = 2
return lambda: x
print(f()()) # prints 2
and
alert((function() {
var x = 2;
return function() {
return x;
};
})()()); // alerts 2
So, am I wrong or?
variables inherited from the outer scope need to be listed explicitely. from the manual:
public function getTotal($tax)
{
$total = 0.00;
$callback =
function ($quantity, $product) use ($tax, &$total)
...
PHP's implementation of closures is slightly different from what you might expect if you're used to using JavaScript. Simply calling function () { return x; }
won't work as you must take advantage of the use
statement.
精彩评论