2012-01-15 147 views
2

驗證然後退出()函數或在if語句中包裝整個驗證結果是好的還是壞的做法?實施例PHP exit()vs if - else語句

function foo($uid) 
{ 

    $allowed = $auth->checkIfAllowed($uid); 

    if ($allowed == false) exit(); 

     //continue with senstive code here 

    } 
} 

OR

function foo($uid) 
{ 

    $allowed = $auth->checkIfAllowed($uid); 

    if ($allowed == true) 
    { 
     // do sensitive stuff 
    } 
} 
+0

你的兩個樣本做不同的工作。第一個終止代碼執行,第二個 - 不是 – zerkms 2012-01-15 00:37:37

+1

你的意思是'return'? – animuson 2012-01-15 00:38:08

+1

我個人不喜歡任何語言的「早期回報」。有些情況下,他們可以使代碼更清晰,但我喜歡「讀取縮進」(其中的帖子有* * - grr!),並保持一致。 – 2012-01-15 00:40:15

回答

0

或。我不認爲這會有所作爲。它相對完全一樣。在編程中,有許多編程方法,絕大多數情況下都不會正確。

0

他們是完全一樣的。縮進和編碼風格是唯一的區別。在這兩種情況下,除非認證成功完成,否則敏感代碼將不會執行。

儘管在代碼中表現力通常會更好,但我建議使用第二種方法。

+0

我問這個問題的原因是因爲第一個方法只是使代碼更清潔..特別是當if語句中有很多代碼時。我不必擔心隱藏在我身上的左括號:) – user1117777 2012-01-15 00:48:25

+0

我知道。如果您打算使用第一種方法,您應始終以某種有意義的反饋生成的方式進行操作。用'trigger_error'或者更好的方法觸發一個錯誤,使用'throw new Exception()'。但不要只是停止執行。通過拋出一個異常,你將停止執行,並且你讓這個調用你的函數的人有機會捕捉到這個異常並且處理這個錯誤(或者簡單地把它作爲一個反饋發送給用戶或者忽略它並記錄在某個地方),它會被追溯。 – 2012-01-15 01:09:16

3

你的例子是等價的。

但是,最終用戶突然退出腳本通常不會有用。相反,例如,向您的用戶發送一條用HTML打印的有用錯誤消息,而不是您從die()調用中獲得的純文本。

function foo($uid) 
{ 

    $allowed = $auth->checkIfAllowed($uid); 

    if ($allowed == false) 
    { 
    $errormsg = "You are not allowed to view this page"; 
    } 

    else 
    { 
    //continue with senstive code here  
    } 
} 

後來,打印錯誤的HTML,而不是僅僅中止腳本:

<div class='error'><?php echo $errormsg; ?></error> 
4

我想借此機會談談exit;(如其他人說這兩個工作,第二比第一個更明確,並且讓你有機會向用戶發送一個很好的錯誤信息)。我的主要牛肉(我有幾個與exit;)是人們應該停止使用它在圖書館,即代碼,可以/將用於其他項目......你知道有多惱火它是調試這些?拋出異常,觸發致命錯誤,但給我東西與描述。

/rant

+1

感謝您的咆哮!如果用戶不被允許,我實際上計劃拋出一個異常,但是當你在這裏時,異常會停止執行其他代碼,如退出嗎? – user1117777 2012-01-15 00:46:47

+1

@Wrikken你認爲我們會看到有一天,所有在線的PHP教程都促進了'do_something()或die(「oops」);'錯誤處理方法已經消失了嗎?它讓我流淚,看到如此常見的SO。 – 2012-01-15 00:49:40

+0

只有當它們被捕獲,並且它們沒有被捕獲,執行仍然會停止,但是在我的錯誤日誌中我可以監控一個很好的錯誤消息,並且有一個描述和一個位置。 – Wrikken 2012-01-15 00:52:10