2011-01-29 109 views
4

在CakePHP中有一個(非常基本的)方法find。大多數情況下,這個方法會返回一個數組,但是如果你通過count作爲第一個參數,這個方法會返回一個不同的數據類型 - 一個整數。返回各種數據類型的函數

該方法被允許返回各種數據類型。

不是那麼糟嗎?

回答

1

腳本語言傾向於使用返回多個類型取決於任一類型的輸入參數或參數值的這種模式。

它可能會令人困惑,但只要你有良好的文檔,它不是一個問題,可以是非常強大的。

強類型語言使用函數重載來做同樣的事情。

1

不,這是一種靈活的方式。在PHP標準函數也返回不同類型。例如strpos()。它可以返回integer位置和boolean錯誤。

+0

亞歷山大,strpos可能不是一個很好的例子,因爲它返回一個整數或false的事實是一個問題,因爲false == 0是true,但false === 0是false,當一個字符串的第一個字母匹配這個會導致問題。然而,作爲返回多種類型的腳本語言的一般規則,接受行爲 – 2011-01-29 16:35:47

+2

僅僅因爲內置插件做得不對。 PHP插件做了很多我認爲很愚蠢的事情。 – sberry 2011-01-29 16:37:21

1

這是設計。 PHP是動態類型化的語言,所以你不能防範返回各種數據類型的函數(不像Java,在這裏你可以確定函數返回什麼)。 這非常靈活(但也可能很糟糕),因此通過編寫單元測試來防止意外的結果是個好主意。 You can see phpunit for a Unit Testing framework.

1

這不是壞事只要行爲記錄在。在C/C++每爲例,這是一個強類型語言,可以實現通過使用空指針類似的結果(void*):

// returns a "const char*" if c == 0 
// returns a "string*" if c == 1 
const void* foo(int c) { 
    const void* a; 
    if (c == 0) { 
     a = (const void*)"foo"; 
    } else if (c == 1) { 
     string* b = new string("bar"); 
     a = (const void*)b; 
    } 
    return a; 
} 

然後你可以這樣做:

const char* x = (const char*)foo(0); // get a const char* 
string* y = (string*)foo(1);   // get a string* 
std::cout << x << *y;    // prints "foobar" 

然而,沒有正確記錄它可能會導致意外的行爲。因爲如果指針被轉換爲意外類型,然後使用:

string* y = (string*)foo(0);   // get a const char*, bad type cast 
std::cout << *y;      // Segmentation fault 

上述編譯正常,但在運行時失敗。當然,在PHP中做類似的事情不會出現段錯誤,但很可能會使程序的其他部分崩潰。