किसी वस्तु को कैसे नष्ट करें?


120

जहां तक ​​मुझे पता है (जो बहुत कम है), दो तरीके हैं, दिए गए हैं:

$var = new object()

फिर:

// Method 1: Set to null
$var = null;
// Method 2: Unset 
unset($var); 

अन्य बेहतर विधि? क्या मैं यहाँ बालों का विभाजन कर रहा हूँ?

जवाबों:


152

तुम खोज रहे हो unset()

लेकिन ध्यान रखें कि आप किसी वस्तु को स्पष्ट रूप से नष्ट नहीं कर सकते।

यह वहाँ रहेगा, हालांकि अगर आप ऑब्जेक्ट को अनसेट करते हैं और आपकी स्क्रिप्ट PHP को मेमोरी में धकेल देती है तो जरूरी नहीं है कि ऑब्जेक्ट कचरा एकत्र किया जाए। मैं unset()(अशक्त करने के लिए इसे स्थापित करने के विपरीत) के साथ जाऊंगा क्योंकि ऐसा लगता है कि इसका बेहतर प्रदर्शन है ( PHP आधिकारिक मैनुअल से टिप्पणियों में से एक पर परीक्षण नहीं किया गया है)।

कहा कि, ध्यान रखें कि पेज को सर्व करते ही PHP हमेशा ऑब्जेक्ट्स को नष्ट कर देता है। तो यह केवल वास्तव में लंबे छोरों और / या भारी गहन पृष्ठों पर होना चाहिए।


1
तो फ्रेंकी, मैं सी ++ से आता हूं, जब हम newएक बार उपयोग करते हैं , तो हमें एक बार उपयोग करना चाहिएdelete । यह PHP में सच नहीं है? जब वस्तु की आवश्यकता नहीं रह जाती है तो स्वचालित कचरा संग्रहण होता है?
gsamaras

3
@gsamaras यह सच है। हालांकि, आपके पास लीक भी हो सकते हैं, और अगर आप डेमन या इसी तरह का काम कर रहे हैं, तो आपको php की GC पर अधिक पढ़ना चाहिए। अधिकांश साइटों में अनुरोध इतना कम रहता है कि इससे कोई फर्क नहीं पड़ता। php.net/manual/en/features.gc.refcounting-basics.php
Frankie

क्या unset()वस्तु के संदर्भ को हटा?
Yousha Aleayoub

9

इस बारे में कई गलत समझ बताने वाली एक आसान पोस्ट:

स्पष्ट रूप से विध्वंसक मत कहो

यह विध्वंसक कैसे काम करता है, इसके बारे में कई गलत धारणाएं शामिल हैं। PHP5 डॉक्टर के अनुसार, इसे स्पष्ट रूप से कॉल करना वास्तव में आपके वैरिएबल को नष्ट नहीं करेगा:

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

ऊपर दी गई पोस्ट बताती है कि चर को शून्य पर सेट करना कुछ मामलों में काम कर सकता है, जब तक कि आवंटित मेमोरी को इंगित नहीं किया जाता है।


2

संक्षिप्त उत्तर: दोनों की आवश्यकता है।

मुझे लगता है कि सही उत्तर दिया गया था लेकिन न्यूनतम रूप से। हाँ आम तौर पर परेशान () "गति" के लिए सबसे अच्छा है, लेकिन अगर आप तुरंत मेमोरी को पुनः प्राप्त करना चाहते हैं (सीपीयू की कीमत पर) अशक्त का उपयोग करना चाहते हैं।

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

आपको यह पता लगाने की आवश्यकता होगी कि कौन सा आपके लिए सबसे अच्छा है। इसके अलावा, आप __destruct () का उपयोग किसी ऐसी वस्तु के लिए कर सकते हैं जिसे असंतुष्ट या अशक्त कहा जाएगा, लेकिन इसका उपयोग सावधानी से किया जाना चाहिए और जैसा दूसरों ने कहा है, कभी भी सीधे नहीं कहा जाना चाहिए!

देख:

http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/

NULL और unset असाइन करने में क्या अंतर है?


0

यह एक सरल सिद्ध है कि आप किसी वस्तु को नष्ट नहीं कर सकते, आप केवल एक लिंक को नष्ट कर सकते हैं।

$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;

रिटर्न

2

इसे यहां देखें: https://eval.in/1054130


3
ठीक है, आपने नष्ट कर दिया है $var2जो एक संदर्भ था $var। अब आप इसे नष्ट कर देते हैं $varऔर मान लेते हैं कि वस्तु पर कोई अन्य संदर्भ नहीं है, तो आप कर रहे हैं।
०३६__

4
आप किसी ऑब्जेक्ट को नष्ट नहीं कर रहे हैं, आप ऑब्जेक्ट के लिए एक पॉइंटर को नष्ट कर रहे हैं। यह एक बड़ा अंतर है।
येवगेनी अफानसेयेव

1
अन्य भाषाओं में आप एक वस्तु को नष्ट कर सकते हैं और अन्य सभी संकेत आपको अपवाद या बकवास देंगे, लेकिन यह php के लिए एक मामला नहीं है
येवगेनी अफनासयेव

1
आप नष्ट नहीं कर सकते। यदि ऑब्जेक्ट को पकड़े हुए कोई संदर्भ नहीं है, तो ऑब्जेक्ट कचरा कलेक्टर द्वारा एकत्र करने के लिए तैयार है। और आप कचरा संग्रहकर्ता को चलाने के लिए मजबूर नहीं कर सकते।
डैनियल

0

ऐसी स्थिति में हो सकता है जब आप एक नई mysqli ऑब्जेक्ट बना रहे हों।

$MyConnection = new mysqli($hn, $un, $pw, $db);

लेकिन इसके बाद भी आप ऑब्जेक्ट को बंद करते हैं

$MyConnection->close();

यदि आप print_r()सामग्री की जाँच करने के लिए उपयोग करेंगे $MyConnection, तो आपको नीचे एक त्रुटि मिलेगी:

Error:
mysqli Object

Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)

जिस स्थिति में आप उपयोग नहीं कर सकते unlink()क्योंकि unlink()इसके लिए पथ नाम स्ट्रिंग की आवश्यकता होगी लेकिन इस मामले $MyConnectionमें एक वस्तु है।

तो आपके पास इसके मूल्य को शून्य करने का एक और विकल्प है:

$MyConnection = null;

अब चीजें ठीक हो जाती हैं, जैसा कि आपने अपेक्षा की है। आपके पास चर के अंदर कोई भी सामग्री नहीं है $MyConnectionऔर साथ ही आपने पहले ही mysqli ऑब्जेक्ट को साफ कर दिया है।

आपके चर का मान सेट करने से पहले ऑब्जेक्ट को बंद करने के लिए एक अनुशंसित अभ्यास है null


-7

मैं परेशान होकर जाऊंगा क्योंकि यह कचरा संग्रहकर्ता को बेहतर संकेत दे सकता है ताकि स्मृति फिर से जल्द उपलब्ध हो सके। इस बात से सावधान रहें कि कोई भी वस्तु या तो अन्य सन्दर्भों की ओर इशारा करती है या पहले परेशान हो जाती है या फिर आपको वास्तव में कचरा बीनने वाले को इंतजार करना होगा क्योंकि तब उनके पास कोई हैंडल नहीं होगा।


16
जब तक आपके पास वास्तव में अपने उत्तरों का समर्थन करने के लिए स्रोत नहीं होते हैं, तब तक आपको संभवतः वह पोस्ट नहीं करना चाहिए जो आपको लगता है कि "हो सकता है"। यह उपयोगी नहीं है और इस तरह की गलत सूचना को सच्चाई और बार-बार लिया जाता है।
meagar

1
@meagar यह सटीक कारण है कि मैं आधिकारिक मैनुअल पेज से जुड़ा हुआ हूं, जहां टिप्पणियों में, अशांति () को शून्य करने के लिए एक नमूना परीक्षण है।
फ्रेंकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.