दिलचस्प सवाल। मैं कहेंगे यह सब पर संभव नहीं है, लेकिन
देख IBM - What's new in PHP5.3, Part 2
का हवाला देते हुए एक बंद एक समारोह है कि अपने परिवेश से मूल्यांकन किया जाता है, जो एक या अधिक बाध्य चर कि हो सकता है है जाने फ़ंक्शन कहलाते समय एक्सेस किया जाता है।
और आगे (जोर मेरा)
चर बाहर के वातावरण से बंद समारोह परिभाषा के उपयोग के खंड में निर्दिष्ट कर रहे हैं आयात करने के लिए। डिफ़ॉल्ट रूप से, वे मान द्वारा पारित किए जाते हैं, जिसका अर्थ है कि अगर हम बंद कार्य परिभाषा के भीतर पारित मान को अपडेट करेंगे, तो यह बाहरी मान को अपडेट नहीं करेगा।
global
का उपयोग संदर्भ द्वारा और हालांकि यह use
खंड में &
का उपयोग करके एक बंद के साथ संदर्भ द्वारा चर बाध्य करने के लिए संभव है मिलेगा, इसलिये यह पहले से ही 5.3 डिफ़ॉल्ट व्यवहार से विचलन है।
$var = 'yes';
$fn = create_function('', 'global $var; $var = "no";');
$fn();
echo $var; // outputs no
आप मूल्य के आधार पर इसका उपयोग करने के लिए वैश्विक चर की प्रतिलिपि बना सकते हैं, उदाहरण के लिए
$var = 'yes';
$fn = create_function('', 'global $var; $tmp = $var; $tmp = "no";');
$fn();
echo $var; // outputs yes
इसके अलावा, वैश्विक चर (जब create_function
का प्रयोग करके) के मूल्य में मूल्यांकन नहीं किया जाएगा (बाध्य) जब समारोह बनाई गई है लेकिन समारोह
$var = 'yes';
$fn = create_function('', 'global $var; $tmp = $var; return $tmp;');
$var = 'maybe';
echo $fn(); // outputs maybe
$var = 'yes';
$fn = function() use ($var) { return $var; };
$var = 'maybe';
echo $fn(); // outputs yes
चलाया जाता है जब भी महत्वपूर्ण
है
किसी ऑब्जेक्ट के भीतर परिभाषित होने पर, एक आसान बात यह है कि बंदरगाह को इस चर के माध्यम से ऑब्जेक्ट तक पूर्ण पहुंच है, इसे स्पष्ट रूप से आयात करने की आवश्यकता के बिना। * हालांकि मुझे लगता है कि इस अंतिम PHP5.3
यह global
कीवर्ड के साथ असंभव है और आप भी सिर्फ $this
उपयोग नहीं कर सकते में हटा दिया गया था। create_function
के साथ फ़ंक्शन बॉडी को परिभाषित करते समय कक्षा से किसी संपत्ति का संदर्भ देने का कोई तरीका नहीं है।में
Fatal error: Using $this when not in object context
इस
संक्षेप में आप एक समारोह वैश्विक क्षेत्र से एक चर का आयात बना सकते हैं
class A {
protected $prop = 'it works';
public function test()
{
$fn = create_function('', 'echo $this->prop;');
return $fn;
}
}
$a = new A;
$fn = $a->test();
$fn();
परिणाम होगा, तो आप एक दायरे से एक चर का उपयोग नहीं कर नहीं बना सकते कर सकते हैं। और क्योंकि create_function
का उपयोग करते समय तकनीकी रूप से बाध्यकारी नहीं होते हैं, लेकिन जब निर्मित फ़ंक्शन निष्पादित किया जाता है तो आयात करना, मैं पर बहस करना चाहता हूं, यह सीमा एक लैम्ब्डा को बंद कर देती है।
संपादित करें: नीचे ओनो मार्समैन द्वारा प्रदान किया गया समाधान काफी सभ्य है। यह क्लोजर को पूरी तरह से अनुकरण नहीं करता है, लेकिन कार्यान्वयन बहुत करीब है।
यह वास्तव में दुखद है कि PHP इस तरह के एक अद्भुत निर्माण का समर्थन नहीं करता है। – ChaosPandion
@CoosPandion लेकिन यह PHP5.3 से – Gordon
अच्छी तरह से करता है, हां, लेकिन आपको स्पष्ट रूप से बंद चर सूचीबद्ध करना होगा। बोलने के लिए "क्रश पर बंद"। हालांकि कुछ भी नहीं से भी बेहतर है। – user187291