2012-03-02 140 views
6

可能重複:
Any way to specify optional parameter values in PHP?PHP函數 - 忽略某些默認參數

只是隨機跨越這來了。

如果我有一個函數,像這樣:

public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){ 

//do something random 

} 

當調用該函數是可以忽略前兩個字段,讓他們默認尚未指定第三位。

例如:

$random = $this->my_model->getSomething(USE_DEFAULT, USE_DEFAULT, 10); 

我知道我可以通過第一和第二參數,但所有IM問的是,如果他們是某種特殊的關鍵字,那只是說使用默認值。

希望是有道理的。它不是一個問題,只是好奇。

感謝您的閱讀

+0

感謝大家的輸入:) – fl3x7 2012-03-02 23:53:40

+0

當調用函數或類的方法時,可以使用Syntactic來忽略默認參數https://github.com/topclaudy/php-syntactic – cjdaniel 2016-06-19 18:30:00

回答

11

你需要做的是自己。您可以使用null以指示默認值應使用:

public function getSomething($orderBy = null, $direction = null, $limit = null) { 
    // fallbacks 
    if ($orderBy === null) $orderBy = 'x'; 
    if ($direction === null) $direction = 'DESC'; 

    // do something random 
} 

然後調用它的時候,表示要使用默認傳遞null

$random = $this->my_model->getSomething(null, null, 10); 

另一種可能的解決方案我有時使用的是參數列表最後的附加參數,其中包含所有可選參數:

public function foo($options = array()) { 
    // merge with defaults 
    $options = array_merge(array(
     'orderBy' => 'x', 
     'direction' => 'DESC', 
     'limit'  => null 
    ), $options); 

    // do stuff 
} 

這樣你就不需要指定所有的可選參數。 array_merge()確保您始終處理一整套選項。你會使用這樣的:

$random = $this->my_model->foo(array('limit' => 10)); 

好像不存在必要參數這種特殊情況下,但如果你需要一個,只要它加入了可選的人的面前:

public function foo($someRequiredParameter, $someOtherRequiredParameter, $options = array()) { 
    // ... 
} 
+0

Syntactic爲此提供了一個很好的方法。在這裏檢查https://github.com/topclaudy/php-syntactic – cjdaniel 2016-06-19 18:31:10

-2

您不能忽略params。但是你可以做這樣的事情:

public function getSomething($limit=null){ 

return $this->getSomething('x','DESC',$limit); 

} 


public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){ 

... 

} 

再見

+2

不,他不能。 PHP不支持重載。 – jwueller 2012-03-02 23:29:42

1

說實話,當函數試圖做得太多時,這成爲一個問題。當你看到一個函數增長到超過幾個參數時(通常是繼承舊代碼的窮人,並且附加參數是「完成工作」的最快方法),幾乎總是有一個更好的設計模式。

難以捉摸的答案是根據你的問題最好的,但看看圈複雜度: http://en.wikipedia.org/wiki/Cyclomatic_complexity

這是要知道,如果你的函數是做太多的好辦法,這使得你的問題更小的問題比現在可能要多。

+0

沒錯。每個人都應該記住複雜性。 +1! – jwueller 2012-03-02 23:46:28

+0

謝謝。將讀入它:) – fl3x7 2012-03-02 23:54:24