2010-11-19 14 views

उत्तर

27

शून्य debug_zval_dump (मिश्रित $ परिवर्तनीय);


कोड:

$var = 1;    # $var's Refcount = 1 
debug_zval_dump($var); # $var is passed by refrence intarlly. 

आउटपुट:

long(1) refcount(2) 

स्पष्टीकरण: $ वर के refcount 1 है, पीएचपी इस का अनुकूलन और के बजाय सीधे स्मृति हैंडल वहां एक प्रतिलिपि बनाने के कारण किसी अन्य संदर्भ को दूषित करने का कोई मौका नहीं है। PHP आंतरिक रूप से संदर्भ द्वारा $ var पास कर रहा है, ताकि अगर इसे भी आवश्यकता हो तो यह स्मृति को सीधे संपादित कर सकता है। दूसरा संदर्भ वास्तव में debug_zval_dump() को कॉल करते समय बनाया गया है।

2 का एक पुनर्विक्रय, यहां, बेहद स्पष्ट नहीं है। तो क्या चल रहा है?

जब एक चर के पास एक संदर्भ होता है (जैसा कि $ var से पहले इसे डीबग_ज़वाल_डम्प() के लिए तर्क के रूप में उपयोग किया जाता था), PHP का इंजन उस तरीके को अनुकूलित करता है जिसमें इसे किसी फ़ंक्शन में पास किया जाता है। आंतरिक रूप से, पीएचपी एक संदर्भ की तरह $ var का व्यवहार करता है (जिसमें इस फ़ंक्शन के दायरे के लिए रीफॉउंट बढ़ाया जाता है), चेतावनी के साथ कि यदि पास संदर्भ संदर्भित होता है, तो एक प्रतिलिपि बनाई जाती है, लेकिन केवल लेखन के समय । इसे "लिखने पर प्रतिलिपि" के रूप में जाना जाता है।

तो, अगर debug_zval_dump() अपने एकमात्र पैरामीटर (और यह नहीं) को लिखने के लिए हुआ, तो एक प्रतिलिपि बनाई जाएगी। तब तक, पैरामीटर एक संदर्भ बना रहता है, जिससे फ़ंक्शन कॉल के दायरे के लिए रीफॉउंट को 2 तक बढ़ाया जा सकता है।


कोड:

$var = 1;    # $var's Refcount = 1 
$var_dup = &$var;  # $var's Refcount = 2 
debug_zval_dump($var); # A copy is passed as $var's refcount is 2. 

आउटपुट:

long(1) refcount(1) 

स्पष्टीकरण: इस बार जब समारोह कहा जाता है $ वर की एक प्रतिलिपि बनाई जा रही है। ऐसा इसलिए है क्योंकि $ var को दो बार संदर्भित किया जाता है और PHP किसी अन्य संदर्भ को दूषित नहीं करना चाहता है, इसलिए यह काम करने के लिए $ var की एक प्रति बनाता है। चूंकि अब स्मृति का एक अलग टुकड़ा है जिसे केवल फ़ंक्शन कॉल के दायरे के लिए उपयोग किया जाता है, केवल इसमें एक प्रतिबिंब होता है, यह स्वयं होता है। तो फ़ंक्शन के दायरे के लिए प्रतिलिपि का पुनर्वित्त 1 है (यह स्वयं है)।

+0

पर शब्द उत्तर के लिए शब्द मैंने एक और उदाहरण प्रदान किया है। – ajx

+6

और यह मैनुअल में पूरी तरह से समझाया गया है। http://php.net/manual/en/function.debug-zval-dump.php –

+1

यह स्पष्ट नहीं है ... – ajx

1

मैं debug_zval_dump() फ़ंक्शन और आपके चर को संसाधित करने के तरीके के बारे में कुछ और प्रकाश देने की कोशिश करूंगा।अगर मैं गलत हूँ मुझे मत मारो:) ...

$var = 1; 
    debug_zval_dump($var); 

मुझे लगता है कि डिबग समारोह में गिना जाता है $var refcount (1) और 1 refcount (2) के बाद से 1 $var का मूल्य है।
यदि आप इसे तर्कसंगत रूप से देखते हैं तो आप वास्तव में यह कह रहे हैं।

1 = 1; 
    debug_zval_dump(1); 

दूसरा हिस्सा:

$var = 1; 
$var_dup = &$var; 
debug_zval_dump($var);exit; 

क्या आप यहाँ देख कि आप $var$var_dup के लिए, लेकिन अपने मूल्य बना रहा सेट है। $var का रेफकाउंट 1 है क्योंकि आपने इसे $var_dup पर 'लिंक किया' है।

$var = 2; 
$var_dup = &$var; //or $var = &$var_dup; (doesn't matter which one) 
$var = 3; 
debug_zval_dump($var_dup);exit; 

यह long(3) refcount(1) देता है ... यह 1 क्यों refcount है? जैसा कि आप देख सकते हैं कि $ var_dup का मान कभी 3 को असाइन नहीं किया गया था, यह 2 सही होना चाहिए? नहीं, ऐसा नहीं होना चाहिए क्योंकि आप इसे & $ var के साथ अद्यतित रखते हैं। इसका अर्थ यह है कि जब आप $var = 4$var = 3 और debug_zval_dump($var_dup);exit; के बीच पिछले $ var_dup का मान स्वचालित रूप से अपडेट हो जाएंगे क्योंकि आपने उन्हें लिंक किया है, इसे 1 रीफॉउंट बना दिया है।

$var = 2; 
$var_dup = $var; 
$var = 4; 
debug_zval_dump($var_dup);exit; 

इस के उत्पादन में है: long(2) refcount(2)

तो फिर वहाँ यह अन्य घटना है। जैसा कि आप $ var_dup का मान देख सकते हैं सही है। $ var 2 था, मान $ var_dup के माध्यम से पारित किया गया था जिसे उसने चिपकाया था। रेफकाउंट 2 है क्योंकि $var = 4; और $var_dup = $var; की गणना की जाती है।

$var = 2; 
$var_dup = $var; 
debug_zval_dump($var_dup);exit; 

इस के उत्पादन में है: long(2) refcount(3) जब हम $var = 4; हटाने हम इस मिलता है। अब डीबग फ़ंक्शन निम्न की गणना करता है: $var_dup (1), =$var (2) (चूंकि $ var_dup $ var से उत्पन्न हुआ था) और $var (= 2;) (3)।

मुझे आशा है कि आप समझेंगे कि मेरा क्या मतलब है। मेरी राय में यह प्रोग्रामिंग के बाद और अधिक गणित है, इसलिए यही कारण हो सकता है कि यह समझने में एक कठिन कार्य है।

और फिर, अगर मैं गलत हूँ, मुझे मत मारो:) ...
नमस्ते,
Mixxiphoid

अस्वीकरण
मैं नहीं जानता कि क्या उद्देश्य इस समारोह की है । मैंने वास्तव में आज तक इसके बारे में कभी नहीं सुना है। तो मैं अनुचित उपयोग के लिए ज़िम्मेदार नहीं हूँ :)।

1

2 का एक पुनर्विक्रय, यहां, बेहद स्पष्ट नहीं है। खासकर उपर्युक्त उदाहरणों पर विचार करना। तो क्या चल रहा है?

जब एक चर के पास एक संदर्भ होता है (जैसा कि $ var1 किया गया था, इसे डीबग_ज़वाल_डम्प() के लिए तर्क के रूप में उपयोग करने से पहले किया गया था, तो PHP का इंजन उस तरीके को अनुकूलित करता है जिसमें इसे किसी फ़ंक्शन में पास किया जाता है। आंतरिक रूप से, PHP $ var1 को एक संदर्भ की तरह व्यवहार करता है (जिसमें इस फ़ंक्शन के दायरे के लिए रीफॉउंट बढ़ाया जाता है), चेतावनी के साथ कि यदि पास संदर्भ संदर्भित होता है, तो एक प्रतिलिपि बनाई जाती है, लेकिन केवल लेखन के समय । इसे "लिखने पर प्रतिलिपि" के रूप में जाना जाता है।"

तो, अगर debug_zval_dump() अपने एकमात्र पैरामीटर (और यह नहीं करता) पर लिखने के लिए हुआ, तो एक प्रतिलिपि बनाई जाएगी। तब तक, पैरामीटर एक संदर्भ बना रहता है, जिससे refcount को 2 तक बढ़ाया जा सकता है समारोह कॉल के दायरे के लिए

- क्रेडिट php मैनुअल के लिए जाने के पूरे विवरण है कि समारोह के साथ आता है पढ़ें और तुम भी यह कहा है कि होना चाहिए

--- संपादित करें:। ।। Woops, मुझे जवाब देने से पहले और अधिक टिप्पणियां पढ़नी चाहिए: डी वैसे भी, यह पहले बताए गए प्रश्न का उत्तर है।

7

मैं इस विधि के लिए प्रलेखन धारा के तहत यह बताता है लगता है कि "खबरदार रेफरी गणना":

debug_zval_dump

+0

+1: बिंदु, लघु, और एक सम्मानित संदर्भ के लिए लिंक। –

+0

+1: :) शुभकामनाएँ! –

2

कोड:

$var = 1; 
debug_zval_dump($var); 

आउटपुट: long(1) refcount(2)

स्पष्टीकरण: जब एक चर के पास एक संदर्भ होता है, जैसा कि किया गया था debug_zval_dump() के लिए तर्क के रूप में उपयोग किए जाने से पहले $ var, PHP का इंजन उस तरीके को अनुकूलित करता है जिसमें इसे किसी फ़ंक्शन में पास किया जाता है। PHP, मूल रूप से परिवर्तनीय और आंतरिक रूप से एक सूचक बनाता है, PHP संदर्भ के रूप में $ var का व्यवहार करता है और इसलिए इस फ़ंक्शन के दायरे के लिए यह रेफकाउंट बढ़ जाता है।

कोड:

$var = 1; 
$var_dup = &$var; 
debug_zval_dump($var);exit; 

आउटपुट: long(1) refcount(1)

स्पष्टीकरण: यहाँ $ वर चर copyied on write है, कि varable की पूरी नई seprate उदाहरण बनाने और क्योंकि debug_zval_dump के साथ काम कर रहा है $ var की एक पूरी नई प्रति, संदर्भ नहीं, यह प्रतिबिंब है 1. फ़ंक्शन पूरा होने के बाद प्रतिलिपि नष्ट हो जाती है।

आशा है कि इसे साफ़ कर दें।

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