2011-01-22 41 views
0

我剛剛重構了一個php頁面,使它稍微容易在未來擴展和維護,並陷入了一個相當簡單的問題。在重構的php代碼中停止執行?

我已經打破一個方法分成3

largemethod()已經成爲這樣的事情:

nowsmallmethod(){ 
    doSomeChecks(); 
    assignProduct(); 
    giveFeedbacktoUser(); 
} 

這是所有好,好,我遇到的問題是doSomeChecks() ;

doSomeChecks(){ 
if(something that shouldnt be true is true){ 
    return Controller->redirectBk(); 
} 
} 

問題的癥結在於當nowsmallmethod()完成時Controller-redirectBk首先重定向。這意味着即使測試失敗,也會爲用戶分配產品。我使用的是一個名爲Silverstripe的PHP框架,所以我不能真正改變Controller-> redirectBk()的行爲。如果我沒有檢查自己的方法,那麼一切都會正常工作,因爲「return Controller-> redirectBk();」會停止執行並重新導回。 當測試失敗時,在nowsmallmethod()中停止執行的最佳方式是什麼?我意識到我可以返回一個錯誤的狀態代碼,然後停止執行,但它似乎是一個醜陋的方式。有沒有更優雅的方式?另一個選擇是,如果我可以在doSomeChecks()返回類似的東西,「return(return $ controller-> redirectBk())」,但這不是有效的PHP語法,也不是特別容易閱讀。任何幫助將非常感激。

享受你的週末! 乾杯 尼克

回答

1
nowsmallmethod() { 
    if (doSomeChecks()) { 
    assignProduct(); 
    giveFeedbacktoUser(); 
    } 
} 

而且doSomeChecks要麼返回true或false,根據重定向是否會發生與否。

或者,您可以diethrow,但我認爲正常情況下更適合您的情況。

+0

這在功能上等同於返回錯誤代碼。我只是認爲可能有更好的方法來做到這一點,但也許不是。在這種情況下,任何失敗的測試都必須設置$ controller-> redirectBk(),然後返回false。歡呼你的建議 – Nick 2011-01-22 23:37:44

1

使用異常處理這樣的情況:

<?php 
try { 
    // some code 
    if (!$check) { 
     throw new Exception('Check has failed!'); 
    } 
    // code after 'throw' will not be executed 
} 
catch(Exception $e) { 
    //this is executed when exception is caught 
} 
?> 

如果異常兒童方法拋出,堆棧將回滾到第一個try/catch塊。閱讀有關例外情況的更多信息:http://php.net/manual/en/language.exceptions.php

此外,您可以將異常與事務機制結合使用來處理數據庫完整性。

+0

例外情況是異常情況下,例如你試圖獲得資源和失敗的地方。我不認爲這是事實。 – smentek 2011-01-22 23:27:22