अनाम फ़ंक्शन का उपयोग कर बाहरी चर के रूप में पहुँच


93

मूल रूप से मैं db पंक्तियों को संसाधित करने के लिए इस आसान फ़ंक्शन का उपयोग करता हूं (PDO और / या अन्य सामान पर एक नज़र बंद करें)

function fetch($query,$func) {
    $query = mysql_query($query);   
    while($r = mysql_fetch_assoc($query)) {
        $func($r);
    }
}

इस फ़ंक्शन के साथ मैं बस कर सकता हूं:

fetch("SELECT title FROM tbl", function($r){
   //> $r['title'] contains the title
});

मान लीजिए कि अब मुझे सभी $r['title']को एक var में बदलना है (यह सिर्फ एक उदाहरण है)।

ऐसा कैसे किया जा सकता था? मैं कुछ इस तरह से सोच रहा था, लेकिन यह बहुत सुंदर नहीं है:

$result = '';
fetch("SELECT title FROM tbl", function($r){
   global $result;
   $result .= $r['title'];
});

echo $result;

जवाबों:


188

आप उपयोग करने के लिए है useके रूप में किए गए दस्तावेज़ों में वर्णित :

क्लोज़र पैरेंट स्कोप से वेरिएबल भी ले सकते हैं। फ़ंक्शन हेडर में ऐसे किसी भी चर को घोषित किया जाना चाहिए। पैरेंट स्कोप से वेरिएबल इनहेरिट करना वैश्विक वैरिएबल का उपयोग करने के समान नहीं है। ग्लोबल वैरिएबल ग्लोबल स्कोप में मौजूद हैं, जो कि समान है जो किसी भी फंक्शन को अंजाम दे रहा है।

कोड:

$result = '';
fetch("SELECT title FROM tbl", function($r) use (&$result) {
   $result .= $r['title'];
});

लेकिन खबरदार (पिछले लिंक में एक टिप्पणी से लिया गया है):

उपयोग () पैरामीटर जल्दी बाध्यकारी होते हैं - वे उस बिंदु पर चर के मूल्य का उपयोग करते हैं जहां लंबा फ़ंक्शन घोषित किया जाता है, बजाय उस बिंदु पर जहां लंबा फ़ंक्शन कहा जाता है (देर से बाध्यकारी)।


1
क्या उस वैश्विक मंदी को नहीं हटाया जाना चाहिए?
अजीज सजा

19
जोर देने के लिए +1 early binding। हालाँकि मैं ऊपर के उदाहरण में अनुमान लगाता हूं कि use (&$result)यह संदर्भ से कब गुजरता है?
दिमित्री के

4
@DimitryK हाँ, संदर्भ का उपयोग डिफ़ॉल्ट व्यवहार (प्रारंभिक बाध्यकारी) को बायपास करने के लिए किया जाता है।
Xaerxess

3
@machineaddict बुनियादी use है जल्दी बंधन - अगर आप मतलब वैकल्पिक हल देर बंधन के लिए - आप के माध्यम से चर से होकर गुजरेगा useसंदर्भ द्वारा - का उपयोग कर &=> use (&$result)और बदलने $resultचर इससे पहले कि आप गुमनाम समारोह (या कुछ और, यह है कि यह कॉल) फोन
jave.web

1
चूंकि क्लास इंस्टेंसेस हमेशा संदर्भ द्वारा पारित किए जाते हैं, इसलिए आपको उनके लिए उपयोग करने की आवश्यकता नहीं होगी। (जब तक आप उदाहरण को पूरी तरह से अधिलेखित नहीं करते)।
जोएल हर्कस

0

केवल एक बार $ func कॉल करने के लिए 'लाने' के बारे में क्या?

function fetch($query,$func) {
    $query = mysql_query($query);   
    $retVal = array();
    while($r = mysql_fetch_assoc($query)) {
        $retVal[] = $r;
    }
    $func($retVal);
}

इस तरह से आप $ func को केवल एक बार कॉल करेंगे और एक बार प्राप्त किए गए एरे को फिर से प्रोसेस करेंगे? प्रदर्शन के बारे में भी सुनिश्चित नहीं है कि एक समारोह में 200 बार कॉल करने से अच्छा विचार नहीं आता है।


हाँ आप सही है। हालाँकि, आप mysql_fetch_assoc () के बजाय mysql_fetch_assoc () का उपयोग कर सकते हैं यदि आप कुछ ms यहाँ और वहाँ प्राप्त करने में रुचि रखते हैं ... तो आपको अपने कॉलम की स्थिति जानना मुश्किल होगा। ऐसा करने से, आप प्रत्येक 30 पंक्तियों के 2000 अनुरोधों पर 0.205 से 0.180 तक पास करते हैं।
user103307
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.