2010-01-01 231 views
8

我一直在阅读PHP 5.3的新功能,其中一个主要功能是关闭PHP关闭是打破了还是我错过了什么?

除非我非常糟糕错的PHP开发人员要么是:
一)混淆了刚刚匿名函数
二)封闭在PHP 5.3.1破封在我测试

来自what wikipedia says闭包是匿名函数加上函数的父代作用域变量与函数作用域的绑定的机制。最后一部分似乎在PHP中被破坏。

我检查了PHP的bug,并且奇怪地发现了这个。

这里是我如何测试:

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

我没有新的PHP测试:( – 2010-01-01 19:26:19

回答

12

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

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

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

换句话说,一个软糖。 – Don 2010-01-01 19:37:30

+0

我会叫它明确的闭包变量识别,而不是忽悠。 – 2010-01-01 20:04:04

+2

谢谢,我已经研究过这一点更详细的信息,显然这个用法只是复制变量,而不是实际上将它们绑定到作用域,所以除非你使用&$ tax(通过refference),否则如果你在创建匿名函数后改变税收,你将得到以前创建的函数的旧值,PHP实际上只是通过复制变量来伪造闭包,而不是实际上将它们绑定到作用域。 – Prody 2010-01-02 11:27:37

3

PHP的实施封锁是,如果你已经习惯了使用JavaScript你所期望的稍有不同。只需致电function() { return x; }将无法​​正常工作,因为您必须利用use声明。

+0

并感谢上帝。 – 2010-01-01 19:39:20

+0

@Pekka为什么? – 2010-01-01 20:10:21