2011-05-02 89 views
3

首先,我想說我不想在這裏開始戰爭。我知道我的談話可能會有一些強烈的意見,關於下面的話題,所以我正在尋找一個概述利弊的答案。在設計方面,有兩種方法可以傳遞參數(注意,我並不是說要在被調用的函數中獲取參數),但是在鬆散類型的語言中(我特別來自PHP的觀點) 。PHP函數設計:傳遞參數

一方面,你可以將它們作爲單獨的參數如下:

foo($var1, $var2, $var3 ...);

在另一方面,你可以在你的變量打包成一個數組,然後傳遞一個參數的功能,數組:

$bar[] = $var1; 
$bar[] = $var2; 
$bar[] = $var3; 
... 

foo($bar); 

我可以看到第二個方法的好處,當你有很多的需要在一個通用的方法進行處理的變量,但是,它也隱藏哪些變量的函數需要以操作correctl年。

第一種解決方案雖然隨着變量數量的增加而迅速變爲長函數調用,但它更好地顯示了函數需要的變量,並且在函數調用中傳遞了空值時可以利用功能來分配默認值。

因此,在什麼情況下應該使用哪一種或哪種情況,以及中間的情況如何,例如,數組是關聯的,因此您可以在函數內部通過名稱獲取變量,通用的方式?對我來說,關聯數組的場景看起來非常不理想,而且只是一些開發人員使用這種方式來縮短函數調用時間,同時實際增加寫入的總體代碼量。

+0

我想把它移到程序員SE上,因爲從PHP的角度來看,它與任何其他語言沒有什麼不同(除了PHP不允許[超載](http://en.wikipedia.org/)維基/ Method_overloading))。 – 2011-05-02 18:59:56

+0

@Kevin:這是一個很好的編程相關問題。它應該在SO上。 – NikiC 2011-05-02 19:04:37

+0

@nikic,它是如何更少[程序員SE](http://programmers.stackexchange.com/)。我們正在討論開發方法(來自程序員SE常見問題),而不是那麼多的算法,工具等(SO常見問題解答) – 2011-05-02 19:07:20

回答

2

我認爲你傳遞數組的例子是毫無意義的。如果你這樣做,你應該肯定使用正常的方式傳遞參數。

function x($width = 100, $height = 100, $color = 'red') 

在這裏,如果你想改變顏色,但不更改默認:如果一個函數接受這可以在幾乎任何順序傳遞一些可選參數

傳遞一個數組是唯一有用的你需要做的寬度和高度:

x(100, 100, 'blue'); 

iee您需要複製代碼中的默認值。

而是一個可以宣佈的功能如下:

function x(array $opts) { 
    $opts += array('width' => 100, 'height' => 100, 'color' => 'red'); 
} 
x(array('color' => 'blue')); 

爲了更真實的例子,看看在Twig_Environment構造函數:正如你可以看到,有相當一些選項,大多數的他們你可能會想保持其默認值。如果您必須將所有這些選項作爲參數傳遞,您只需通過複製默認值來擴大代碼。

+1

您的示例顯示關聯數組的傳遞說明了PHP的*窮人的命名參數*。許多ORM實現使用這種方法。 – webbiedave 2011-05-02 19:29:13

+1

你的例子並不完全正確。沒有必要將默認值複製到函數調用。函數定義中的默認值將替換空值,以便您可以調用'x(null,null,'blue')' – Endophage 2011-05-02 19:31:41

+1

@Endophage:這是不正確的。調用'x(null,null,'blue')'會將null的值賦給'$ width'和'$ height'。 – webbiedave 2011-05-02 19:34:54