php

2010-07-06 17 views
10

में अनसेट वैरिएबल I php मैनुअल के माध्यम से बस अनसेट चर के बारे में पढ़ा।php

php मैनुअल का कहना है

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

यह परिभाषा मेरे लिए एक अच्छा नहीं लगता है कम से कम, क्योंकि "चर को नष्ट करें" का तात्पर्य है कि परिवर्तनीय अब नहीं है उस स्मृति स्थान के साथ ssociated।

क्या कोई और सोचता है कि एक बेहतर परिभाषा "अनसेट() मौजूदा स्कोप से परिवर्तनीय बनाती है"? मेरा मतलब है, जीवन भर की ओर इशारा करते हुए, यहां शब्द क्षेत्र का उपयोग करना बेहतर है?

+0

यह SO के लिए एक अच्छा सवाल नहीं है। आप PHP मेलिंगलिस्ट या जो भी हो, में ऐसी चीजें बता सकते हैं, लेकिन इसका कोई मूल्य नहीं है। आप उत्तर से क्या उम्मीद करेंगे? यदि आप कहते हैं * हाँ * क्या आप संतुष्ट हैं? ;) –

+1

फ़ेलिक्स, मैं सिर्फ एक नौसिखिया हूं यदि आप हाँ कहें तो यह निश्चित रूप से मेरा आत्मविश्वास बढ़ाएगा और यदि आप कहते हैं तो निश्चित रूप से कुछ सीखना होगा, लेकिन अगले से मैं इसका ख्याल रखूंगा। थैंक – Tarun

उत्तर

13

के समारोह पर विचार करें

 
function name: foo 
number of ops: 11 
compiled vars: !0 = $bar 
line  # * op       fetch   ext return operands 
--------------------------------------------------------------------------------- 
    2  0 > EXT_NOP             
    4  1  EXT_STMT             
     2  FETCH_W      static    $0  'bar' 
     3  ASSIGN_REF            !0, $0 
    5  4  EXT_STMT             
     5  POST_INC           ~1  !0 
     6  FREE              ~1 
    6  7  EXT_STMT             
     8  UNSET_VAR            !0 
    7  9  EXT_STMT             
     10 > RETURN             null 

एक चर वास्तव में foo() करने के लिए प्रत्येक समारोह कॉल के बाहर मौजूद है और, प्रत्येक कॉल पर, इसे लाए जाने है और के लिए एक संदर्भ इसे $bar को सौंपा गया है।वास्तव में, यह बहुत ही इस के समान है:

function foo() { 
    global $bar; 
    $bar++; 
    unset($bar); 
} 

जब आप unset() फोन, आप केवल संदर्भ आपके द्वारा बनाए गए नहीं अंतर्निहित कीमत को नष्ट कर रहे हैं।

मैं पुष्टि नहीं था, लेकिन मुझे लगता है कि क्या होता है ऐसा होता है यह है:

  • variabe (zval) की अंतर्निहित प्रतिनिधित्व संग्रहीत किया जाता है, ताकि उसके संदर्भ गिनती है 1.
  • जब foo() कहा जाता है, तो प्रतीक $bar इस ज़वाल से जुड़ा हुआ है, इसकी संदर्भ संख्या 2 तक बढ़ी है और संदर्भ ध्वज सेट है।
  • जब unset कहा जाता है, तो ज़वाल की संदर्भ संख्या 1 तक घट जाती है, संदर्भ ध्वज शायद साफ़ हो जाता है और प्रतीक $bar हटा दिया जाता है।

reference count basics देखें।

+0

आपको बहुमूल्य जानकारी – Tarun

+3

@artefactor के लिए बहुत बहुत धन्यवाद, मुझे यह जानकर उत्सुकता है कि आपने इसे कैसे उत्पन्न किया डाल? – MANCHUCK

+0

@Atetefacto, क्या यह आउटपुट एचएचवीएम या जेडई के लिए है? – Pacerier

9

फ़ंक्शन के अंदर, स्थैतिक चर संदर्भित चर नाम केवल .. संदर्भ हैं। असल में, संदर्भ को नष्ट कर देता है।

+0

आप कहना चाहते थे कि मैं एक स्थैतिक चर घोषित करें (एक एफएन के अंदर विचार करें) स्थिर $ a = 2; $ बी = $ ए + 2; // यहां $ स्थिर स्थिर चर $ एक का पुनर्नवीनीकरण बन गया है ?? मैंने आपको संकेत नहीं दिया है – Tarun

+0

स्थिर चर के लिए, डेटा मान के लिए ढेर पर स्थान आवंटित किया गया है, और संदर्भ लिंक के लिए स्टैक पर स्थान आवंटित किया गया है। संदर्भ को अनसेट करते समय, केवल स्थानीय स्टैक स्पेस को नष्ट/पुनः दावा/अमान्य बना दिया जाता है। उपयोगी जानकारी के लिए – Zak

+0

धन्यवाद ज़क धन्यवाद – Tarun

3

अनसेट (स्वयं :: $ कुछ व्यवस्थित); एक घातक त्रुटि उठाएगी, क्योंकि चर स्थिर है (हमेशा वहां, अनसेट नहीं किया जा सकता है)।

प्रलेखन एक समारोह के अंदर परिभाषित स्थैतिक चर करने के लिए विशेष रूप से संदर्भित करता है, पर विचार करें:

function t($stage) 
{ 
    static $shell = 23; 
    switch($stage) { 
    case 1: 
     $shell++; 
     break; 
    case 2: 
     unset($shell); 
     break; 
    case 3: 
     $shell--; 
    break; 
    } 
    echo $shell; 
} 

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

इस प्रकार यदि आप ऊपर समारोह टी फोन (1) 24 गूंज होगा, टी (2) कुछ भी नहीं गूंज जाएगा, और टी (3) (ठीक ही) गूंज होगा 23 :)

मदद किसी भी?

+0

मुझे यह कहना अच्छा लगता है कि "किसी भी अन्य बार जब आप केवल एक संदर्भ है जो $ खोल का उल्लेख करते हैं:" लेकिन AFAIK ..in php मेमोरी को संदर्भ के लिए भी आवंटित किया गया है ?? सही मुझे – Tarun

+0

धन्यवाद नाथन i din, t पता है कि स्थाई संपत्ति को अनसेट करने से त्रुटि – Tarun

+0

इस उत्तर ने मुझे –

0

ठीक है, unset() क्या एक चर नाम से जुड़ी मेमोरी को साफ़ करता है।

स्थैतिक चर के मामले में, हालांकि, आप जो कुछ भी हो रहा है, वह स्थिर चर को फ़ंक्शन के दायरे से अलग कर रहा है, और हर बार जब आप फ़ंक्शन को कॉल करते हैं, तो आप स्वचालित रूप से उस चर की एक प्रति प्राप्त करते हैं।

तो, इसका मतलब यह है कि यदि आप unset एक स्थिर चर हैं, तो आप केवल unset प्रतिलिपि बनाते हैं, इसलिए जब फ़ंक्शन को दोबारा बुलाया जाता है, तो यह एक नई प्रति "प्राप्त करता है"।

function foo() { 
    static $bar; 
    $bar++; 
    unset($bar); 
} 
foo(); //static $bar is 1 
foo(); //static $bar is 2 

कार्य करने के लिए संकलित:

+0

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

+0

अच्छी तरह से, आप जो कह रहे हैं उसके साथ समस्या यह है कि वास्तव में, एक 'स्थिर' घोषित चर * फ़ंक्शन के दायरे में * नहीं है, और यही वजह है कि यह कॉल टू कॉल से अधिक है। ओटीओएच, यदि आप मानते हैं कि यह उस स्थैतिक चर की प्रति है कि आप "स्कोप से बाहर निकल रहे हैं" –

1

यदि गलत नहीं है, तो बिंदु एक स्थिर चर को अनसेट करना है। विभिन्न कारणों से यह उपयोगी हो सकता है, इसके अतिरिक्त यह कुछ स्मृति मुक्त करेगा। उदाहरण के लिए:

unset($some_static_var_or_property_holding_a_big_object); 

हम इस बिल्कुल के रूप में है हासिल नहीं कर सकते, कुछ मामलों में यह करने के लिए पर्याप्त हो सकता है:

$some_static_var_or_property_holding_a_big_object = null; 

यह कुछ स्मृति (मुझे लगता है) मुक्त होता है और हमें करने की अनुमति होगी ऐसी वस्तु को नष्ट करें जिसे हम अब नहीं चाहते हैं (मुझे उम्मीद है कि मैं विषय से बाहर नहीं हूं)।