2010-01-01 114 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

相關問題