2011-04-21 158 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()中寫入一些東西來檢查funcB()的結果,但在我的情況下,我無法控制funcA()的內容。我只能控制funcB()的內容。

爲了使這個例子更具體一些;在這個特定的例子中,我正在使用WordPress。我掛鉤到the get_template_part() function,並試圖通過執行我的鉤子後調用的locate_template()函數來阻止實際需要/包含該文件的WordPress。

有沒有人有任何建議?

+0

我還建議問你想在WP上做什麼。也許有一個函數或wp_filter可以用來代替。我會問這裏和wordpress.stackexchange.com網站。 – 2011-04-21 17:20:48

回答

1

拋出一個exceptionfuncB未在funcA

+0

雖然濫用流量控制的例外情況是* evil *。 – delnan 2011-04-21 17:23:04

+0

@delnan - 代碼不殺人...人們殺人;) – 2011-04-21 17:27:14

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()的代碼,所以我將無法將try/catch語句放入該函數中。 – cgrymala 2011-04-22 13:30:39

+0

然後你可以將你的調用包裝到異常處理程序中的funcA()中。 – 2011-04-22 16:07:20

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

感謝您的提示。我應該可以爲我做這個工作。我很希望能夠在不編輯任何模板文件(這是我必須放置try/catch語句的地方)的情況下完成此操作,但這是未來的良好信息。 – cgrymala 2011-04-22 13:30:05

相關問題