2012-06-17 95 views
4

這個問題是關於PHP的,但我猜它也可能適用於其他語言。-1作爲返回值

我注意到在PHP4和PHP5之間,語言的設計者從使用-1作爲返回值轉向使用常量或其他形式的輸出。這是有道理的,因爲-1不是特別令人回味,我猜這種做法導致了混亂。

這就是說,我有時傾向於返回-1時,我想另一個回報選項快速增加功能,和-1常常似乎想表達我編碼結果完全有效的方式。

因此,這裏是我的問題:

  1. 是我的觀察通常是正確的,關於移動從-1遠爲VS PHP4 PHP5中的返回值?

  2. 返回-1的缺點是什麼,超出了我之前提到的原因,其中-1返回值對編碼清晰度沒有正面貢獻?

回答

6

這只是一種預感,但根據我的經驗,沒有什麼理由或一致性來設計PHP的選擇。我還發現許多失敗時返回FALSE的函數,許多函數還有一個附加說明,您必須明確區分FALSE和強制爲FALSE的其他(有效)值,例如, 0。在這種情況下,我認爲-1是一個更好的返回值。

當然,您可以隨時返回-1並定義具有有意義名稱的常量,並將其映射到-1

+4

「在PHP中設計選擇沒有什麼理由或一致性」 - [這可能不是更真實的](http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design /) – nickb

2

我猜測任何仍然返回-1的PHP函數都是因爲傳統原因這樣做的。

對於簡單的函數,其中有一個邏輯上合理的錯誤響應,不涉及返回一個神祕的數字代碼,那麼應該使用它。例如,返回null,false0可能足以傳達發生的事情。但對於更復雜的功能,特別是那些可能有多種故障模式的功能,可以考慮把它們分解成不同的功能,每個功能處理整個任務的一小部分。

您也可以拋出異常:

function doSomething() { 
    if (fooFails()) { 
     throw new Exception('Foo failed to work properly.'); 
    } else if (barFails()) { 
     throw new Exception('Bar failed this time.'); 
    } 

    return "blahblah"; 
} 

你也可以繼承的Exception類,以提供更多的特異性,您可以使用try-catch塊檢測哪一個。總的來說,我認爲最好使用這樣的面向對象的原則。它會產生更清晰和可維護的代碼,特別是在您完全忘記爲什麼按照您的方式編寫代碼後的6個月後。

class FooException extends Exception { 
    // nothing else needed here 
} 

class BarException extends Exception { 
    // nothing else needed here 
} 

function doSomething() { 
    if (fooFails()) { 
     throw new FooException(); 
    } else if (barFails()) { 
     throw new BarException(); 
    } 

    return "blahblah"; 
} 

然後你可以使用:

try { 
    $output = doSomething(); 

} catch (FooException $e) { 
    // respond to the FooException case 

} catch (BarException $e) { 
    // respond to the BarException case 

} catch (Exception $e) { 
    // respond to any and all other exceptions that might be thrown 
} 
+2

它很大程度上取決於函數的作用以及返回'-1'的原因是否是一個實際的*異常*原因。例外情況是控制流結構,通常是信號錯誤和其他條件。如果你有一個像在字符串中查找子字符串那樣簡單的事情,那麼當沒有找到子字符串是正確的事情時,我懷疑拋出異常。 – Joey

+0

好點。但是在子字符串示例中,返回null或false工作也是如此。我並不是主張在每一種情況下都使用異常,但是當使用null,false,0或類似的東西不能涵蓋可能的故障模式範圍時,異常可能是傳達所發生事件的唯一明確方式。 – curtisdf

+0

爲了清晰起見,我已經更新了我的答案,特別是關於您提到的簡單功能。 – curtisdf

1

這是口味的問題。我個人更喜歡使用數字。他們看起來更適合我。

但是在一些情況下,使用truefalse是更優選的。像這樣:

function isXYZ($a) { 
    if (...) return true; 
    return false; 
}