2012-09-25 219 views
5

當存在需要被傳遞的若干參數的函數,例如七個參數,這是更好的做法:將參數數組與參數傳遞給PHP中的函數?

function foo($par1, $par2, $par3, $par4, $par5, $par6, $par7) 
{ 
} 

function foo(array $args) 
{ 
} 

凡在本第二示例$args將參數爲元素的數組。

我一直使用這兩種方法不一致。

使用第一種方法的缺點是,如果你得到一個參數的順序錯了,你就完蛋了(它可能是真的很難調試,因爲它並不總是顯而易見的)。這是使用數組方法的優點。

使用第一種類型的好處(恕我直言)是,當您輸入函數時,一個好的PHP編輯器(例如PhpStorm)會向您顯示參數的名稱,這比查看函數的參數更容易需要在數組中傳遞。

感謝您的建議。

+0

在項目環境中,您曾經爲您工作過。 – 2012-09-25 20:52:52

+0

如果您有7個參數的功能,它可能有太多的責任。 –

回答

4

理論上,每個參數都應該包含一個邏輯整體。集合旨在表示值的集合,而不是方法參數的集合;應該分別傳遞各個參數以清楚地表明該方法的目的。

實際上,在數組中傳遞參數的時候,你必須做一噸的人工檢查,以確保正確的參數已經過去了。你可以通過給你的參數清楚,邏輯名稱(和可能的字體提示)來避免非常多的歧義。另外,正如已經說過的評論,如果一個方法需要7個參數,那麼對於一些重構可能已經成熟。

編輯:如果你的方法/函數確實接受一組影響的代碼不會只在一個較小的方式是什麼定義模糊的「選項」,可以考慮使用的Symfony OptionsResolver組件,大大減輕你的選擇驗證陣列。

0

如果您有很多基於參數的選項或想要更多的靈活性,請嘗試func_get_args()

function foo() 
{ 
    $arg_list = func_get_args(); 
    for ($i = 0; $i < $numargs; $i++) { 
     echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; 
    } 
} 

如果你想縮小可接受的參數,那麼定義變量是最好的。

1

我認爲這個問題可以歸結爲「如何強類型是php?」「我想讓自己的東西變得多強有力?」

明顯,該陣列是最鬆耦合。變量和它們的名字的數量完全由調用者決定。

您與單獨的參數調用是一點點的強耦合,因此必須有至少提供的參數的數量。

恕我直言,你忘了一個類型的主叫的,那就是用type hinting。這是目前php提供的最強大的打字方式。

例如:

function foo(\MyNamespace\MyObject $par1, \YourNamespace\YourObject $par2) 
{ 
} 

我的觀點:我只有強類型語言的背景下,我更喜歡強類型typed hinting。有傳言說,PHP 5.5或PHP 6也將支持標量作爲類型提示。