2010-08-19 82 views
13

當在php中返回值時,返回混合數據類型是否是好的或不好的做法。我正在研究一個項目,我經常遇到返回一個id號或null的方法。我通過檢查null來處理null值,如果它是null,則返回-1php返回混合數據類型 - 好還是壞

我發現自己很多的另一種情況是方法應該做些什麼並返回一個字符串。但有時無法返回字符串,因爲它沒有找到或發生異常。這裏最好的做法是什麼?返回一個字符串,如「失敗」或什麼?這然後創建了一個方法之間的字符串耦合,我想,因爲調用方法必須準確知道字符串失敗消息來檢查?

編輯:好的,已經有一些不同的意見了。無論數據類型是否成功,我都喜歡在失敗和實際結果上返回false。但是......說到這裏,有沒有事實上的最佳做法?我的意思是,在這些情況下,其他語言的程序員做什麼,例如java和C++等等?

回答

8

我通常所做的是如果方法工作,返回值,如果失敗返回FALSE。這就是很多PHP的內置方法。那麼,你可以檢查函數是否返回FALSE。

+1

是的,這是有道理的,但我想這是我認爲不同的數據類型被返回的地方。這在許多語言中都沒有真正允許 - 這是好的還是不好的做法? – david 2010-08-19 19:36:53

+0

返回混合類型不錯。 – 2010-08-19 19:38:36

+0

PHP不是強類型語言,函數沒有像其他語言那樣顯式返回類型。 – 2010-08-19 19:38:40

4

我認爲返回混合數據類型是不好的做法。正如您所指出的那樣,您可以考慮代碼的可讀性和可維護性。確保你評論你迴歸的原因以及爲什麼,我認爲這將是最重要的。如果你期待返回一個int,並且返回-1而不是null,那麼評論一下,所以你(或者其他人)不會瘋狂地試圖找出你想要做的事情。

+1

而不是返回-1更好的方法是返回false。是的使用文件。例如phpdoc提到什麼函數返回 – 2010-08-19 19:38:20

4

Null是一個相當常見的返回值,表示沒有返回值。如果函數根本不返回任何ID,則應該返回null(而不是「失敗」或-1)。

如果是例外找不到ID,應該拋出異常。

+2

提及異常。我希望核心使用它們更多... – ircmaxell 2010-08-19 19:52:04

0

一個返回混合值的函數不會被認爲是不好的,實際上這就是php的美妙之處,它是一種動態語言,所以要做的就是在失敗時返回false,如果函數正確執行則返回所需的值。

if(false == ($data = do_something())) return false; 
else print_r($data); 
+4

你應該使用'===',而不是'=='。 「0 == false」是真的。 – 2010-08-19 19:41:28

+1

0 == false是true,所以是null == false和'== == false等等。 使用===或==通常取決於情況。 – 2010-08-20 15:37:21

2

我同意上面的答案。

但是,如果你設計了一個完整的系統,那麼「最佳實踐」就是使用異常:總是返回一些有意義的東西,並在發生異常時拋出異常。然後來電者可以處理他知道如何面對的情況,並讓其他人知道如何處理。

+1

是的,但例外情況只能用於特殊情況。身份證不存在等真的應該由適當的返回值處理?那麼你是否會陷入過度使用異常的可能性,並將它們用於一切? – david 2010-08-19 19:56:59

+2

作爲您決定何時使用它的軟件架構師。我認爲異常是保護部分代碼執行的好方法。返回「false」的問題是您不知道它返回的原因。因此,您必須清楚地識別出只有一個可能返回錯誤的情況(例如「結束循環」),否則您可能冒險混淆不同的錯誤。因此,在您的API中,您會寫入: 返回:通常情況下爲字符串,循環結束時爲false,在其他情況下引發異常。 – greg 2010-08-20 13:15:39

+1

只是想+1 @Greg說的。如果您正在執行基於異常的編程,則返回false(或「false」)是一種反模式。 – 2013-01-21 15:54:37

3

返回混合類型是壞的,至少今天在2013年。熱潮!要走的路是分裂的:

BAD,混合返回類型風格:

function checkResult($data) 
{ 
    if ($data) { 
     ... 
     return $stuff; 
    } else { 
     return false; 
    } 
} 

人們將需要額外的邏輯來工作checkRsult(),他們從來不知道到底會返回一個類型。

好,顯然固定回報型風格:

也許這個例子並不是真的很不錯,但它顯示的路要走。

function doesResultExist($data) 
{ 
    if ($data) { 
     return true; 
    } 
    // default return 
    return false; 
} 

function getResultData() 
{ 
    ... 
    return $stuff; 
}