【问题标题】:Are PHP closures broken or am I missing something?PHP 闭包是坏了还是我错过了什么?
【发布时间】:2010-12-31 15:41:43
【问题描述】:

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

那么,我错了吗?

【问题讨论】:

  • 我没有要测试的新 php :(

标签: php closures


【解决方案1】:

从外部范围继承的变量需要明确列出。来自手册:

public function getTotal($tax)
{
    $total = 0.00;

    $callback =
        function ($quantity, $product) use ($tax, &$total)
...

【讨论】:

  • 我称之为显式闭包变量标识,而不是软糖。
  • 谢谢,我已经更详细地研究了这一点,显然使用的东西只是复制变量而不是实际将它们绑定到范围。因此,除非您使用 &$tax(通过引用),否则如果您在创建匿名函数后更改税款,您将从先前创建的函数中获取旧值。 PHP 实际上只是通过复制 var 来伪造闭包,而不是实际将它们绑定到作用域。
【解决方案2】:

如果您习惯于使用 JavaScript,PHP 的闭包实现与您所期望的略有不同。简单地调用function () { return x; } 是行不通的,因为您必须利用use 语句。

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2011-07-21
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多