2008-09-30 14 views

उत्तर

35

जब सभी संदर्भ मुक्त हो जाते हैं, या जब स्क्रिप्ट समाप्त हो जाती है तो विनाशक को बुलाया जाएगा। मुझे लगता है कि जब स्क्रिप्ट ठीक से समाप्त हो जाता है तो इसका मतलब है। मैं कहूंगा कि महत्वपूर्ण अपवाद विनाशक को बुलाए जाने की गारंटी नहीं देंगे।

PHP documentation थोड़ा पतला है, लेकिन यह कहता है कि विनाशक में अपवाद मुद्दों का कारण बनेंगे।

+1

मैं कह सकता हूँ, कि शटडाउन प्रक्रिया के दौरान अपवाद विभाजन दोष हो सकता है। – KingCrunch

+4

इसके अलावा, एक विनाशक के अंदर निकास() को कॉल करना जो पहले से बाहर निकलने के अंदर है() अनुक्रम अतिरिक्त विनाशकों के बिना प्रक्रिया को समाप्त कर सकता है। –

+1

क्षमा करें, मैं आपके उदाहरण की कल्पना नहीं कर सका। क्या आप विस्तृत कर सकते हैं? @JasonCohen – revo

41

यह भी उल्लेखनीय है कि, उप-वर्ग के मामले में जिसका अपना विनाशक है, माता-पिता विनाशक स्वचालित रूप से नहीं बुलाया जाता है।

आप स्पष्ट रूप से कॉल करनी होगी माता पिता :: __ विनाश() उपवर्ग __destruct से() विधि यदि माता पिता वर्ग किसी भी आवश्यक सफाई करता है।

+14

मेरा मानना ​​है कि यह तभी सच है जब बच्चा वर्ग अपने स्वयं के __destruct() को लागू करता है, अन्यथा माता-पिता __destruct() को बुलाया जाएगा। – Geoff

+2

बहुत सच है। मैं स्पष्ट करने के लिए संपादित किया। –

10

सर्कुलर संदर्भों के साथ एक वर्तमान बग है जो विनाश विधि को पूरी तरह से बुलाया जाता है। http://bugs.php.net/bug.php?id=33595 यह 5.3

+0

यह 5.3 में बंद था। – robsch

11

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

PHP documentation of destructors का कहना है:

PHP 5 एक नाशक अवधारणा इस तरह के सी ++ के रूप में अन्य वस्तु उन्मुख भाषाओं, के समान परिचय देता है। विनाशक विधि को जल्द से जल्द बुलाया जाएगा क्योंकि किसी विशेष वस्तु के लिए कोई अन्य संदर्भ नहीं है, या शट डाउन अनुक्रम के दौरान किसी भी क्रम में।

परिणामस्वरूप यदि आपके पास कक्षा X है जो वाई के संदर्भ में है, तो एक्स के विनाशक को पहले ही बुलाया जा सकता है। उम्मीद है कि वाई का संदर्भ इतना महत्वपूर्ण नहीं था ... आधिकारिक तौर पर यह एक बग नहीं है क्योंकि इसे दस्तावेज किया गया है।

हालांकि, इस मुद्दे को हल करने में बहुत मुश्किल है क्योंकि आधिकारिक तौर पर PHP यह जानने का कोई तरीका नहीं है कि विनाशक को सामान्य रूप से कहा जाता है (विनाशकों को सही क्रम में बुलाया जाता है) या विनाशकों को "किसी भी" क्रम में कहा जाता है जहां आप संदर्भित डेटा का उपयोग नहीं कर सकते वस्तुओं क्योंकि वे पहले ही नष्ट हो चुके हैं। डीबग_बैकट्रैस() और स्टैक की जांच करके पता लगाने की कमी की कमी हो सकती है। सामान्य स्टैक की कमी PHP 5.3 के साथ "शट डाउन अनुक्रम" का संकेत देती है लेकिन यह भी अपरिभाषित है। यदि आपके पास परिपत्र संदर्भ हैं, तो उन वस्तुओं के विनाशकों को PHP 5.2 या उससे कम के साथ बिल्कुल नहीं कहा जाएगा और PHP 5.3 या उससे अधिक में "शट डाउन अनुक्रम" के दौरान "किसी भी" क्रम में कहा जाएगा। परिपत्र संदर्भों के लिए, तर्कसंगत "सही" क्रम मौजूद नहीं है, इसलिए "कोई भी" आदेश उन लोगों के लिए अच्छा है।

कुछ अपवाद हैं (इस पीएचपी सब के बाद है):

  • अगर exit() एक और नाशक में कहा जाता है, किसी भी शेष विनाशकर्ता (http://php.net/manual/en/language.oop5.decon.php)
  • अगर FATAL त्रुटि कहीं भी होता है (कई बुलाया नहीं की जाएगी संभावित कारण, उदाहरण के लिए किसी भी अन्य विनाशक से अपवाद फेंकने का प्रयास एक कारण हो सकता है)

बेशक, यदि PHP इंजन सेगमेंटेशन गलती या कुछ अन्य अंतर नल बग होता है, तो सभी दांव बंद होते हैं।

+0

PHP के लिए तर्क: "मैं वर्तमान कार्यान्वयन पर चिपक रहा हूं क्योंकि मुझे लगता है कि यह सबसे अच्छा व्यापार-बंद है। - एंडी"। स्रोत: http://www.mail-archive.com/[email protected]/msg06393.html –

+3

मूल रूप से कोडर के दो समूह होते हैं: (1) विध्वंसक में वैश्विक चर का उपयोग करने वाले कोडर और (2) कोडर जो करते हैं विनाशकों में वैश्विक चर का उपयोग न करें और आश्रित वस्तुओं के ऑब्जेक्ट संदर्भों का उपयोग करके निर्भरता को सही ढंग से चिह्नित करें। चूंकि PHP नीचे के अंत को लक्षित करने का प्रयास करता है क्योंकि यह (1) से अधिक (2) को पूरा करता है। समूह (2) को गलत तरीके से काम करने वाले कोड के साथ छोड़ दिया गया है और इस मुद्दे को हल करने का कोई आधिकारिक तरीका नहीं है। –

+0

यह भी देखें: http://stackoverflow.com/questions/2385047/when-will-destruct-not-be-called-in-php –

8

बंद फ़ंक्शन का उपयोग करें यदि आप सुनिश्चित करने के लिए जाना चाहता हूँ: register_shutdown_function()

+2

प्रलेखन से: "register_shutdown_function() को एकाधिक कॉल किए जा सकते हैं, और प्रत्येक इच्छा पंजीकृत होने के समान क्रम में बुलाया जाना चाहिए। अगर आप एक पंजीकृत शट डाउन फ़ंक्शन के भीतर बाहर निकलें() को कॉल करते हैं, तो प्रोसेसिंग पूरी तरह से बंद हो जाएगी और कोई अन्य पंजीकृत शट डाउन फ़ंक्शन नहीं कहा जाएगा। " इस बात की कोई गारंटी नहीं है कि * आपके * शट डाउन फ़ंक्शन को कॉल किया जाएगा यदि कुछ अन्य शट डाउन फ़ंक्शन आपके सामने चलता है। –

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

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