2014-07-08 98 views
1

我正在寫幾個函數傳遞參數到函數中,但其中許多函數需要20-30個參數傳遞給函數。就本例而言,我只在下面的函數中包含代碼的相關部分。傳遞20+參數到一個函數

例如,我想參數傳遞到這樣的功能:

function shortexample($id, $name, $pass) { 
    $body = array(
     'username' => "$name", 
     'password' => "$pass", 
     'campaign_id' => $id 
    ); 
} 

哪裏預見問題,正在通過許多(20-50)變量到函數,而不是上面只有3,似乎如果我通過太多的論證,可能會有一個記憶問題,因此通過這麼多論證的效率非常低下。

所以我的實際問題是什麼是有效地將一個荒謬的數量的參數傳遞到PHP函數的最佳方法是什麼。

我不想問你們是否發佈完成的代碼,儘管我歡迎你可以提供的任何代碼片段,但是我真的想知道你們認爲最好的做法是通過極端數量的代碼參數轉換成函數。

更新/澄清: 更具體地,對於需要這麼多參數的目的,是因爲這些值所必需的API請求。我不是一遍又一遍地編寫相同的代碼,而是編寫一個函數,我可以根據需要調用API請求,但我需要將參數/變量傳遞到函數中,然後將它們放入數組中,這是然後與API請求一起發送。所有的值都是非常小的字符串或數字值。

+9

傳遞20個參數肯定不會導致內存問題。雖然這是非常糟糕的風格。考慮傳遞一個(關聯)數組。 –

+2

使用OOP或數組。 – deem

+3

很難說你的具體情況,但總的來說,如果你需要這麼多的參數,這是一個糟糕的設計的標誌。也許有不同的結構。通常,這個問題可以通過使用類似於構建器模式的模式來解決,但是沒有足夠的信息來判斷這是否是這種情況。 – GolezTrol

回答

4

我相信讓無論是通過依賴注入復值的最佳方式,採用了更先進的編程模型,尤其是面向對象的

function shortexample(\stdClass $args) { 
    $body = array(
     'username' => $args->username, 
     'password' => $args->pass, 
     'campaign_id' => $args->id, 
    ); 
} 

你應該提高,將接收的對象的定義,使用接口

//.... 
interface shortExampleInterface { 
    public function getUsername(); 
    public function getPass(); 
    public function getId(); 
} 



function shortexample(\shortExampleInterface $args) { 
    $body = array(
     'username' => $args->getUsername(), 
     'password' => $args->getPass(), 
     'campaign_id' => $args->getId(), 
    ); 
} 

但我認爲這是在上下文實際上可能需要非常的參數,它是值得嘗試的PHP 5.6的新功能:

參數可變型函數

此功能讓您可以拍攝可變數量的參數的函數,在如果你喜歡通過「正常」的論點相結合。這是最容易看到的例子:

function concatenate($transform, ...$strings) { 
    $string = ''; 
    foreach($strings as $piece) { 
     $string .= $piece; 
    } 
    return($transform($string)); 
} 

echo concatenate("strtoupper", "I'd ", "like ", 
    4 + 2, " apples"); 

的參數列表中函數聲明有...運營商它,它基本上意味着「......以及其他一切應該進入$strings」。您可以將2個或更多參數傳遞給該函數,並且第二個和後續參數將被添加到$strings陣列中,準備使用。

實施例2:

function f($req, $opt = null, ...$params) { 
    // $params is an array containing the remaining arguments. 
    printf('$req: %d; $opt: %d; number of params: %d'."\n", 
      $req, $opt, count($params)); 
} 

f(1); 
f(1, 2); 
f(1, 2, 3); 
f(1, 2, 3, 4); 
f(1, 2, 3, 4, 5); 
+0

我認爲這個答案對於一個過於一般的問題來說太籠統了。儘管如此,不是我的失望。我同意你的思路。 - 編輯 - 我現在看到了代碼添加,我不完全同意這一點。 stdClass不允許進行類型檢查。我寧願使用特定的類或接口。 – GolezTrol

+0

我還在寫作:D – gpupo

+0

Cheerio!這樣更好。 ;) – GolezTrol

0

傳遞一個關聯陣列這將是功能列表。每個鍵都是參數的名稱($ id,$ name $ etc),並且該值將是您想要爲該參數傳遞的值。

1

在PHP 5.6之前,您可以使用func_get_args()來獲取傳遞的所有參數數組。您還可以使用call_user_func_array()來傳遞解包傳遞給函數的參數數組。

相關問題