2010-01-01 13 views
8

मैं PHP 5.3 की नई विशेषताओं पर पढ़ रहा हूं, और प्रमुख सुविधाओं में से एक बंद है।क्या 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 

तो, मैं गलत हूँ या

यहाँ मैं कैसे परीक्षण हूँ ?

+0

मेरे पास परीक्षण करने के लिए नया PHP नहीं है :( –

उत्तर

12

बाह्य दायरे से विरासत में प्राप्त चर को स्पष्ट रूप से सूचीबद्ध करने की आवश्यकता है। मैनुअल से: बंद के

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

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

दूसरे शब्दों में, एक झुकाव – Don

+0

मैं इसे स्पष्ट बंद चर वैरिएबल पहचान कहूंगा, एक झगड़ा नहीं। –

+2

धन्यवाद, मैंने इसे थोड़ा सा देखा है अधिक जानकारी, और स्पष्ट रूप से उपयोग की बात सिर्फ चर की प्रतिलिपि बना रही है और वास्तव में उन्हें दायरे में बाध्य नहीं कर रही है। इसलिए जब तक आप अज्ञात कार्य निर्माण के बाद कर बदलते हैं, तो आप $ और कर (प्रतिबिंब द्वारा) का उपयोग नहीं करते हैं, तो आपको पहले बनाए गए फ़ंक्शन से पुराना मान। PHP वास्तव में केवल स्कॉप्स पर बाध्य करने के बजाए वर्र्स की प्रतिलिपि बनाकर बंद कर देता है। – Prody

3

PHP के कार्यान्वयन आप क्या उम्मीद कर सकते हैं अगर आप जावास्क्रिप्ट का उपयोग करने के लिए इस्तेमाल कर रहे हैं से थोड़ा अलग है। बस function() { return x; } पर कॉल करना काम नहीं करेगा क्योंकि आपको use कथन का लाभ उठाना होगा।

+0

और इसके लिए भगवान का शुक्र है। –

+0

@Pekka वह क्यों है? –

संबंधित मुद्दे