PHP5 में, प्रत्येक ऑब्जेक्ट उदाहरण के लिए __destruct() विधि को कॉल करने की गारंटी है? कार्यक्रम में अपवाद इसे होने से रोक सकते हैं?क्या मैं PHP __destruct() विधि को कॉल करने के लिए भरोसा कर सकता हूं?
उत्तर
जब सभी संदर्भ मुक्त हो जाते हैं, या जब स्क्रिप्ट समाप्त हो जाती है तो विनाशक को बुलाया जाएगा। मुझे लगता है कि जब स्क्रिप्ट ठीक से समाप्त हो जाता है तो इसका मतलब है। मैं कहूंगा कि महत्वपूर्ण अपवाद विनाशक को बुलाए जाने की गारंटी नहीं देंगे।
PHP documentation थोड़ा पतला है, लेकिन यह कहता है कि विनाशक में अपवाद मुद्दों का कारण बनेंगे।
यह भी उल्लेखनीय है कि, उप-वर्ग के मामले में जिसका अपना विनाशक है, माता-पिता विनाशक स्वचालित रूप से नहीं बुलाया जाता है।
आप स्पष्ट रूप से कॉल करनी होगी माता पिता :: __ विनाश() उपवर्ग __destruct से() विधि यदि माता पिता वर्ग किसी भी आवश्यक सफाई करता है।
मेरा मानना है कि यह तभी सच है जब बच्चा वर्ग अपने स्वयं के __destruct() को लागू करता है, अन्यथा माता-पिता __destruct() को बुलाया जाएगा। – Geoff
बहुत सच है। मैं स्पष्ट करने के लिए संपादित किया। –
सर्कुलर संदर्भों के साथ एक वर्तमान बग है जो विनाश विधि को पूरी तरह से बुलाया जाता है। http://bugs.php.net/bug.php?id=33595 यह 5.3
यह 5.3 में बंद था। – robsch
मेरे अनुभव विनाशकर्ता में हमेशा पीएचपी 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 इंजन सेगमेंटेशन गलती या कुछ अन्य अंतर नल बग होता है, तो सभी दांव बंद होते हैं।
PHP के लिए तर्क: "मैं वर्तमान कार्यान्वयन पर चिपक रहा हूं क्योंकि मुझे लगता है कि यह सबसे अच्छा व्यापार-बंद है। - एंडी"। स्रोत: http://www.mail-archive.com/[email protected]/msg06393.html –
मूल रूप से कोडर के दो समूह होते हैं: (1) विध्वंसक में वैश्विक चर का उपयोग करने वाले कोडर और (2) कोडर जो करते हैं विनाशकों में वैश्विक चर का उपयोग न करें और आश्रित वस्तुओं के ऑब्जेक्ट संदर्भों का उपयोग करके निर्भरता को सही ढंग से चिह्नित करें। चूंकि PHP नीचे के अंत को लक्षित करने का प्रयास करता है क्योंकि यह (1) से अधिक (2) को पूरा करता है। समूह (2) को गलत तरीके से काम करने वाले कोड के साथ छोड़ दिया गया है और इस मुद्दे को हल करने का कोई आधिकारिक तरीका नहीं है। –
यह भी देखें: http://stackoverflow.com/questions/2385047/when-will-destruct-not-be-called-in-php –
बंद फ़ंक्शन का उपयोग करें यदि आप सुनिश्चित करने के लिए जाना चाहता हूँ: register_shutdown_function()
प्रलेखन से: "register_shutdown_function() को एकाधिक कॉल किए जा सकते हैं, और प्रत्येक इच्छा पंजीकृत होने के समान क्रम में बुलाया जाना चाहिए। अगर आप एक पंजीकृत शट डाउन फ़ंक्शन के भीतर बाहर निकलें() को कॉल करते हैं, तो प्रोसेसिंग पूरी तरह से बंद हो जाएगी और कोई अन्य पंजीकृत शट डाउन फ़ंक्शन नहीं कहा जाएगा। " इस बात की कोई गारंटी नहीं है कि * आपके * शट डाउन फ़ंक्शन को कॉल किया जाएगा यदि कुछ अन्य शट डाउन फ़ंक्शन आपके सामने चलता है। –
- 1. क्या मैं mod_rewrite पर भरोसा कर सकता हूं?
- 2. क्या मैं अपने पर्यावरण चर पर भरोसा कर सकता हूं?
- 3. क्या मैं अपने फ्रेम के लिए शून्य UIView लौटने वाले CGRectZero पर भरोसा कर सकता हूं?
- 4. क्या मैं मॉलोक पर वापस भरोसा कर सकता हूं?
- 5. क्या मैं संकलक को एक विशिष्ट विधि को अनुकूलित करने के लिए मजबूर कर सकता हूं?
- 6. क्या मैं फेसबुक कनेक्ट पर भरोसा कर सकता हूं?
- 7. क्या मैं रेफरर HTTP शीर्षलेख पर भरोसा कर सकता हूं?
- 8. क्या मैं service.onStartCommand में stopSelf() को कॉल कर सकता हूं?
- 9. मैं एक पोस्ट पर गेट विधि कॉल करने के लिए Html.RenderAction कैसे प्राप्त कर सकता हूं?
- 10. क्या मैं कॉन्स्ट char * पर स्ट्रेल को अनुकूलित करने के लिए अपने कंपाइलर पर भरोसा कर सकता हूं?
- 11. क्या मैं removeMouseListener() को कॉल करने के लिए बाध्य हूं?
- 12. क्या मैं AJAX कॉल करने के लिए फोनगैप Jquery का उपयोग कर सकता हूं?
- 13. मैं webservice को कॉल करने के लिए async/प्रतीक्षा का उपयोग कैसे कर सकता हूं?
- 14. क्या मैं एक PHP फ़ंक्शन बना सकता हूं जिसे मैं बिना किसी कोष्ठक के कॉल कर सकता हूं?
- 15. क्या मैं कुछ लौटने के लिए एक अमूर्त वर्ग की विधि को मजबूर कर सकता हूं?
- 16. मैं सदस्यwise क्लोन() को कैसे कॉल कर सकता हूं?
- 17. मैं क्लास विधि के लिए उपनाम विधि को गतिशील रूप से कैसे परिभाषित कर सकता हूं?
- 18. मैं सर्वरस्केट स्वीकार() विधि को कैसे बाधित कर सकता हूं?
- 19. क्या मैं डेटाबेस के बिना रेल का उपयोग कर सकता हूं और केवल वेब सेवाओं को कॉल कर सकता हूं?
- 20. क्या मैं फ़ाइल प्रकार को $ _FILES से भरोसा कर सकता हूं?
- 21. क्या मैं विधि में कोड का निरीक्षण करने के लिए प्रतिबिंब का उपयोग कर सकता हूं?
- 22. क्या मैं एक छिपी हुई (लेकिन सार्वजनिक) विधि को ओवरराइड कर सकता हूं और इसकी सुपर विधि कह सकता हूं?
- 23. मैं इस कॉल को नोडज सिंक्रोनस में अनुरोध करने के लिए कैसे कर सकता हूं?
- 24. सी # में बेस कन्स्ट्रक्टर को कॉल करने के लिए मैं कैसे मजबूर कर सकता हूं?
- 25. मैं इन सभी कॉल को प्रस्तुत करने के लिए कैसे कर सकता हूं: अनुक्रमणिका?
- 26. क्या Windows में अंतर्निहित DbgHelp.dll है? क्या मैं वहां पर भरोसा कर सकता हूं?
- 27. क्या मैं जेनेरिक का उपयोग करने के लिए निम्नलिखित कोड को परिवर्तित कर सकता हूं?
- 28. क्या मैं एकाधिक छवि ऑनलोड कॉल सिंक कर सकता हूं?
- 29. क्या मैं प्राइमेटिव्स पर डिलीट कॉल कर सकता हूं?
- 30. मैं एक ओवरराइड वर्चुअल विधि के 'आधार कार्यान्वयन' को कैसे कॉल कर सकता हूं?
मैं कह सकता हूँ, कि शटडाउन प्रक्रिया के दौरान अपवाद विभाजन दोष हो सकता है। – KingCrunch
इसके अलावा, एक विनाशक के अंदर निकास() को कॉल करना जो पहले से बाहर निकलने के अंदर है() अनुक्रम अतिरिक्त विनाशकों के बिना प्रक्रिया को समाप्त कर सकता है। –
क्षमा करें, मैं आपके उदाहरण की कल्पना नहीं कर सका। क्या आप विस्तृत कर सकते हैं? @JasonCohen – revo