Are PHP closures broken or am I missing something?

自古美人都是妖i 提交于 2019-12-23 08:51:25

问题


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 testing

From 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 actually 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?


回答1:


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)
...



回答2:


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.



来源:https://stackoverflow.com/questions/1989352/are-php-closures-broken-or-am-i-missing-something

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!