2013-02-23 43 views
24

में पैरेंट स्कोप से एक्सेस चर, मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो लेन-देन लॉगिंग करने वाले कुछ गंदे काम करता है, लेकिन अज्ञात फ़ंक्शन स्कोप पेरेंट स्कोप $db और $value चर पंजीकृत करने के लिए प्रतीत नहीं होता है। मैं चर को कैसे बंद कर सकता हूं?गुमनाम PHP फ़ंक्शन

विडंबना यह है कि एसओ टैग 'क्लोजर' इसका PHP संस्करण बहुत सटीक वर्णन नहीं करता है ...?

class controller 
{ 
    function submit() 
    { 
     $db = new database(); 
     $result = $db->execute_tx(function() { 
      $db->insert_model_a($value_a); // ERROR: $db is non-object 
      $db->insert_model_b($value_b); 
     }); 
    } 
} 

class database 
{ 
    function execute_tx($atomic_action) 
    { 
     try 
     { 
      $this->start(); 
      $atomic_action(); 
      $this->commit(); 
      // etc.. 
     } 
     catch(...) 
     { 
      $this->rollback(); 
      // etc.. 
     } 
     finally 
     { 
      // etc.. 
     } 
    } 

    function insert_model_a() { ... } 
    function insert_model_b() { ... } 
} 

उत्तर

46

समारोह की गुंजाइश में चर बाध्य करने के लिए use कीवर्ड का प्रयोग करें।

function() use ($db) { 

क्लोजर भी माता-पिता के दायरे से चर प्राप्त कर सके। ऐसे किसी भी चर को फ़ंक्शन हेडर में घोषित किया जाना चाहिए [use का उपयोग करके]।

http://www.php.net/manual/en/functions.anonymous.php

+1

यही एक रास्ता है? क्योंकि मुझे कुछ सबमिट में 10 से 15 मान पसंद हैं और मेरे पास कई सबमिट करने के लिए सबमिट किया गया है ... – Jake

+0

हां। आपको उन चरों को स्पष्ट रूप से आयात करना होगा जिन्हें आप बंद करना बंद करना चाहते हैं। – salathe

+0

यह न भूलें कि आप सामान्य फ़ंक्शन तर्कों के माध्यम से चर में भी पास कर सकते हैं। – salathe