2011-05-02 82 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