2010-05-06 14 views
6

मैं PHP निर्माता और विनाशक व्यवहार को समझने की कोशिश कर रहा हूं। सब कुछ कन्स्ट्रक्टर के साथ अपेक्षित है लेकिन मुझे विनाशक को आग लगने में परेशानी हो रही है। मैंने php.net और संबंधित साइटों पर सभी पढ़ाई की है, लेकिन मुझे इस प्रश्न का उत्तर नहीं मिल रहा है।PHP विनाशक व्यवहार

तो मैं एक साधारण वर्ग, जैसे कुछ है: यह निर्माता संदेश प्रिंट

$t = new test; 

:

class test{ 

    public function __construct(){ 
      print "contructing<br>"; 
    } 

    public function __destruct(){ 
      print "destroying<br>"; 
    } 
} 

और मैं की तरह कुछ से कॉल करने की। हालांकि, मैं उम्मीद करता हूं कि जब स्क्रिप्ट समाप्त होती है और पृष्ठ प्रस्तुत किया जाता है कि विनाशक को आग लगनी चाहिए। बेशक यह नहीं करता है।

अगर मैं अनसेट ($ टी) कहता हूं; जब स्क्रिप्ट समाप्त होती है, निश्चित रूप से विनाशकारी आग लगती है, लेकिन क्या यह आग लगने का कोई तरीका है? कोई सुझाव

+3

स्टैक ओवरफ़्लो में आपका स्वागत है :) –

उत्तर

4

__destruct() जादू समारोह जब वस्तु को नष्ट कर दिया/नष्ट कर दिया है निष्पादित किया जाता है के लिए

धन्यवाद (unset का उपयोग)। इसे स्क्रिप्ट के बंद होने के दौरान नहीं कहा जाता है। जब एक PHP स्क्रिप्ट निष्पादित करने के समाप्त हो जाती है, तो यह स्मृति को साफ़ करती है, लेकिन यह वस्तुओं को 'हटाएं' नहीं देती है, इस प्रकार __destruct() विधियों को नहीं कहा जाता है।

आप register_shutdown_function() के बारे में सोच रहे हैं, जो आपकी PHP स्क्रिप्ट निष्पादित होने पर निकाल दिया जाता है।

function shutdown() 
{ 
    // code here 
    echo 'this will be called last'; 
} 

register_shutdown_function('shutdown'); 
+0

ठीक है, स्पष्टीकरण – kris

+10

के लिए धन्यवाद वास्तव में, मैनुअल के मुताबिक यह सच नहीं है। Http://php.net/manual/en/language.oop5.decon.php देखें। "विनाशक विधि को जल्द ही बुलाया जाएगा जैसे किसी विशेष वस्तु के सभी संदर्भ हटा दिए जाते हैं या जब वस्तु स्पष्ट रूप से नष्ट हो जाती है या शट डाउन अनुक्रम में किसी भी क्रम में।" –

+2

आपको शटडाउन फ़ंक्शन में ब्राउज़र को लिखने की कोशिश करने के बारे में बहुत सावधान रहने की आवश्यकता है -" सभी खोले आउटपुट बफर को बंद करने के बाद शटडाउन फ़ंक्शंस को कॉल किया जाता है "- अल्थूग स्टडआउट अभी भी जुड़ा हुआ है, यह आउटपुट स्ट्रीम नहीं हो सकता है जिसका आप पहले उपयोग कर रहे थे – symcbean

3

मेरी समझ यह है कि स्क्रिप्ट समाप्त होने पर विनाशकों को स्वचालित रूप से किसी भी शेष वस्तु के लिए बुलाया जाता है।

हालांकि manual page on constructors and destructors देखते हुए, यह विनाशकर्ता बायपास करने के लिए एक ही रास्ता लगता है पूरी तरह से है अगर आप एक वस्तु है कि प्रश्न में वस्तु से पहले नष्ट कर दिया है की नाशक से exit() कहते हैं।

क्या आप अपने किसी भी विनाशक में exit() का उपयोग कर रहे हैं? क्या आपकी लिपि में भी कई वस्तुएं हैं?

यदि यह बहुत अधिक परेशानी नहीं है, तो शायद आप अपने प्रश्न में नमूना कोड के बजाय वास्तविक कोड को प्रश्न में पोस्ट कर सकते हैं। आपके नमूना कन्स्ट्रक्टर में टाइपो के अलावा, वह कोड आपके test ऑब्जेक्ट के लिए कंडक्टर और विनाशक दोनों को कॉल करना चाहिए।

+2

मुझे लगता है कि यह उससे अधिक जटिल है। अगर आप किसी विनाशक में 'निकास' डालते हैं तो पहली बार ऑब्जेक्ट को नष्ट कर दिया जाता है 'register_shutdown_function' के साथ पंजीकृत किसी भी फ़ंक्शन को कॉल करेगा और फिर किसी भी अन्य विनाशकों को कॉल करेगा। यदि उन विध्वंसकों में 'निकास' भी शामिल है तो स्क्रिप्ट वहां रुक जाएगी। यानी, बाहर निकलने वाला पहला कॉल स्क्रिप्ट को शटडाउन मोड में रखता है, दूसरी सेना इसे तुरंत बंद करने के लिए। जब ​​तक दूसरा निकास शटडाउन फ़ंक्शन के अंदर न हो - वह एक 'वापसी' की तरह कम या ज्यादा व्यवहार करता है। – mpen

9

यह परीक्षण करना बहुत आसान है।

<?php 

class DestructTestDummy { 
    protected $name; 

    function __construct($name) { 
     echo "Constructing $name\n"; 
     $this->name = $name; 
    } 

    function __destruct() { 
     echo "Destructing $this->name\n"; 
     //exit; 
    } 
} 

echo "Start script\n"; 

register_shutdown_function(function() { 
    echo "Shutdown function\n"; 
    //exit 
}); 

$a = new DestructTestDummy("Mr. Unset"); 
$b = new DestructTestDummy("Terminator 1"); 
$c = new DestructTestDummy("Terminator 2"); 

echo "Before unset\n"; 
unset($a); 
echo "After unset\n"; 


echo "Before func\n"; 
call_user_func(function() { 
    $c = new DestructTestDummy("Mrs. Scopee"); 
}); 
echo "After func\n"; 

$b->__destruct(); 

exit("Exiting\n"); 

पीएचपी 5.5.12 में यह प्रिंट:

Start script 
Constructing Mr. Unset 
Constructing Terminator 1 
Constructing Terminator 2 
Before unset 
Destructing Mr. Unset 
After unset 
Before func 
Constructing Mrs. Scopee 
Destructing Mrs. Scopee 
After func 
Destructing Terminator 1 
Exiting 
Shutdown function 
Destructing Terminator 2 
Destructing Terminator 1 

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

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