2010-07-15 12 views
10

क्या PHP ऑब्जेक्ट उदाहरण के लिए खुद को नष्ट/अनसेट करना संभव है? मान लें कि मेरे पास एक वर्ग है जो एक फ़ाइल का प्रतिनिधित्व करता है, और उसके बाद मैं कक्षा का उपयोग कर उस फ़ाइल को हटा देता हूं। क्या मैं किसी भी तरह से अपने स्वयं के तरीकों से उदाहरण को अनसेट कर सकता हूं?क्या कक्षा का उदाहरण आत्म-विनाश कर सकता है?

$file = new FileClass(); 

$file->copy('/some/new/path/'); 
$file->delete(); 

// ... at this point $file would be seen as unset. 
+1

यहाँ एक अनिवार्य रूप से समान प्रश्न के "हाँ और यहाँ-है कि कैसे" जवाब दिया - http://stackoverflow.com/a/21367011/1537018 –

उत्तर

14

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

आप

unset($file); 

क्यों इस्तेमाल करते हैं और एक __destruct समारोह है जिसमें आप कार्य आप सामान्य रूप से delete में प्रदर्शन करेंगे प्रदर्शन को परिभाषित नहीं है?

+0

यह कुछ ऐसा था जिसे मैंने माना है। इस दृष्टिकोण के साथ एकमात्र मुद्दा निश्चित रूप से पठनीयता होगी। 5 साल बाद इस कोड पर वापस देखकर, या किसी को पहली बार देखकर, कॉलिंग को अनसेट करने का कोई तरीका नहीं होगा() वास्तव में फ़ाइल को हटा रहा था। – Wilco

+1

मुझे लगता है कि यह वास्तव में सबसे अच्छा समाधान है जिसे पाया जा सकता है, इसलिए मैं इसे स्वीकृत उत्तर के रूप में चिह्नित करने जा रहा हूं। – Wilco

0

एकमात्र समाधान मैं के बारे में सोच सकते हैं कि:

function delete($var_name) { 
    unset($GLOBALS[$var_name]); 
} 

तो फिर तुम कार्य करें:

$file->delete('file'); 

वैसे भी, एक वर्ग नहीं कर सकते हैं (बाहर से मदद के बिना) आत्महत्या।

+6

काम नहीं करेगा यदि वैश्विक दायरे में '$ file' नहीं है, हालांकि –

+0

' वैश्विक $ {$ var_name} जोड़ना; ' – xorinzor

+1

को हल करना चाहिए दायरे को बढ़ाएं इसे कचरा इकट्ठा करने के लिए मूल्य के पीछे की तरफ है। इसे वैश्विक कारण बनाना एक ही नाम के मौजूदा मूल्यों के साथ संघर्ष करता है, साथ ही यह अधिक कोड तक पहुंचने की अनुमति देता है, और इसलिए मूल्य पर निर्भर करता है। यह इसे हटाने के लिए * कठिन * बनाता है। आपका समाधान मूल्य को किसी भी अन्य "फ़ाइल" ग्लोबल (पूर्व-मौजूदा या अभी तक जोड़ा जाने वाला) के साथ हटा देगा, और इन मानों में से किसी भी अन्य उपयोगकर्ता को तोड़ देगा। – Warbo

4

वैकल्पिक रूप से, आप $ फ़ाइल के दायरे से तो यह कचरा एकत्र हो जाता है जब अब नहीं किया सीमित कर सकते हैं:

call_user_func(function() { 
    $file = new FileClass(); 
    $file->copy('/some/new/path/'); 
    $file->delete(); 
}); 

// ... at this point $file would be seen as unset. 
संबंधित मुद्दे