2011-04-21 10 views
5

PHP के भीतर, यदि मेरे पास एक ऐसा फ़ंक्शन है जो किसी अन्य फ़ंक्शन को कॉल करता है; पूरी स्क्रिप्ट को मारने के बिना कॉलर फ़ंक्शन से बाहर निकलने के लिए बुलाए गए फ़ंक्शन को पाने का कोई तरीका है?आंतरिक फ़ंक्शन के भीतर से बाहरी फ़ंक्शन से बाहर निकलने का कोई तरीका?

उदाहरण के लिए, मान लीजिए कि मैं जैसे कुछ कोड कुछ है करते हैं:, दुर्भाग्य से

<?php 
function funcA() { 
    funcB(); 
    echo 'Hello, we finished funcB'; 
} 

function funcB() { 
    echo 'This is funcB'; 
} 
?> 
<p>This is some text. After this text, I'm going to call funcA.</p> 
<p><?php funcA(); ?></p> 
<p>This is more text after funcA ran.</p> 

अगर मैं funcB करता है कि मुझे परिष्करण से funcA बंद करना चाहते हैं के अंदर कुछ मिल जाए, मैं पूरी बाहर निकलने के लिए है लगता है PHP स्क्रिप्ट। क्या इसके आसपास कोई रास्ता है?

मैं समझता हूं कि मैं funcA() में परिणाम लिखने के लिए funcA() में कुछ लिख सकता हूं, लेकिन, मेरे मामले में, मेरे पास funcA() की सामग्री पर कोई नियंत्रण नहीं है; मैं केवल funcB() की सामग्री पर नियंत्रण रखता हूं।

इस उदाहरण को थोड़ा और ठोस बनाने के लिए; इस विशेष उदाहरण में, मैं वर्डप्रेस के साथ काम कर रहा हूं। मैं the get_template_part() function में हुकिंग कर रहा हूं, और वास्तव में वर्डप्रेस को रोकने की कोशिश कर रहा हूं/वास्तव में फ़ाइल को ढूंढने की कोशिश कर रहा हूं जो explore_template() फ़ंक्शन के माध्यम से है जिसे मेरे हुक निष्पादित करने के बाद बुलाया जाता है।

क्या किसी के पास कोई सलाह है?

+0

आईडी यह भी सुझाव देता है कि आप WP पर क्या करना चाहते हैं। शायद एक फ़ंक्शन या wp_filter है जिसका आप उपयोग कर सकते हैं। मैं यहाँ और wordpress.stackexchange.com साइट पर पूछूंगा। –

उत्तर

1

फेंक एक exceptionfuncB कि funcA

+0

हालांकि प्रवाह नियंत्रण के लिए अपवादों का दुरुपयोग करना * बुरा * है। – delnan

+0

@ डेलनान - कोड लोगों को मारता नहीं है ... लोग लोगों को मारते हैं;) –

0
<?php 
    function funcA() { 
    try 
    { 
     funcB(); 
     echo 'Hello, we finished funcB'; 
    } 
    catch (Exception $e) 
    { 
     //Do something if funcB causes an error, or just swallow the exception 
    } 
    } 

    function funcB() { 
    echo 'This is funcB'; 
    //if you want to leave funcB and stop funcA doing anything else, just 
    //do something like: 
    throw new Exception('Bang!'); 
    } 
?> 
+0

कोशिश के लिए धन्यवाद, लेकिन, जैसा कि मैंने अपनी मूल पोस्ट में कहा था, मेरे पास कोड पर कोई नियंत्रण नहीं है जो funcA(), इसलिए मैं उस फ़ंक्शन के अंदर प्रयास/पकड़ विवरण डालने में सक्षम नहीं होगा। – cgrymala

+0

फिर आप अपवाद हैंडलर में funcA() पर अपनी कॉल को लपेट सकते हैं। –

0

हो सकता है कि में नहीं संभाला है ... में

यह एक समाधान नहीं है, लेकिन आप किसी अन्य समारोह जब बाहर निकलें() अनुरोध किया जाता है कहा जाता हो जाता है कि हुक सकता है "register_shutdown_function ('बंद');"। और किसी भी तरह से यह चीजें फिर से जारी रहती हैं या आपके सैटिफ़ेक्शन में पूर्ण होती हैं।

<?php 
function shutdown() 
{ 
    // This is our shutdown function, in 
    // here we can do any last operations 
    // before the script is complete. 

    echo 'Script executed with success', PHP_EOL; 
} 

register_shutdown_function('shutdown'); 
?> 
0

एक ही रास्ता मैं देख रहा हूँ अपवाद उपयोग कर रहा है:

function funcA() { 
    funcB(); 
    echo 'Hello, we finished funcB'; 
} 

function funcB() { 
    throw new Exception; 
    echo 'This is funcB'; 
} 
?> 
<p>This is some text. After this text, I'm going to call funcA.</p> 
<p><?php try { funcA(); } catch (Exception $e) {} ?></p> 
<p>This is more text after funcA ran.</p> 

बदसूरत, लेकिन यह PHP5 में काम करता है।

+0

टिप के लिए धन्यवाद। मुझे यह काम मेरे लिए करने में सक्षम होना चाहिए। मैं किसी भी टेम्पलेट फाइल को संपादित किए बिना इसे पूरा करने की उम्मीद कर रहा था (जहां मुझे कोशिश/पकड़ने का बयान देना होगा), लेकिन यह भविष्य के लिए अच्छी जानकारी है। – cgrymala