我有一个带5个参数的函数,随着应用程序的增长,我们需要添加更多的参数,这些参数最终有9个参数,其中4个参数有默认值。
我想知道传递这样的参数或使用数组会更好吗?
我更喜欢这样的
fun(array(
'par1' => 'x',
'par2' => 'y',
.....
)
)
Insted of
func($par1, $par2, $par3, ...);
您怎么看?
答案 0 :(得分:11)
但是这里有一些解决这个问题的方法。
如果订单有些固定而你永远不需要改变它,那么:
<?php
function fn($a1, $a2, $a3, $a4, $a5, $a6 = null, $a7 = "foo", $a8 = "bar", array $a9 = array()) {}
<强>赞成强>
<强>缺点强>
另一方面,如果订单总是有些不同,请使用数组。
<?php
function fn($a1, $a2, $a3, $a4, $a5, array $optional = array()) {}
fn("", "", "", "", "", array("arg9" => false));
<强>赞成强>
<强>缺点强>
参数对象当然也是一种有效的解决方案,但处理起来不切实际:
<?php
class Args {
public $arg5 = "foo";
public $arg6 = "bar";
public $arg7 = null;
public $arg8 = array();
public $arg9 = true;
}
function fn($arg1, $arg2, $arg3, $arg4, $arg5, \Args $optional = null) {}
// Now comes the impractical part.
$optional = new Args();
$optional->arg9 = false;
fn("", "", "", "", "", $optional);
<强>赞成强>
<强>缺点强>
你可以混合使用这两种方法:
<?php
class Args {
public $arg5 = "foo";
public $arg6 = "bar";
public $arg7 = null;
public $arg8 = array();
public $arg9 = true;
public __construct($args) {
foreach ($args as $property => $value) {
$this->"set{$property}"($value);
}
}
public function setArg5($value) {
if (is_string($value) === false) {
throw new \InvalidArgumentException;
}
$this->arg5 = $value;
}
// and so on ...
}
function fn($arg1, $arg2, $arg3, $arg4, $arg5, array $optional = null) {
if (isset($optional)) {
$optional = new Args($optional);
}
// ...
}
fn("", "", "", "", "", array("arg9" => false));
<强>赞成强>
<强>缺点强>
您可能会发现PHP 5.6中的一项新功能variadics:
<?php
function fn($a1, $a2, $a3, $a4, $a5, ...$optional) {}
<强>赞成强>
<强>缺点强>
我们将来可能会看到named parameters。
答案 1 :(得分:6)
将9个参数传递给函数是一个明确的code smell:
参数太多:过程中的一长串参数或 功能使可读性和代码质量变差。
有了这么多参数,你很可能违反了:
长方法:一种方法,功能或程序也在增长 大。
创建将这些参数组合在一起的任意array
将无法解决真正的问题。它可以使您的代码更易于阅读,并且对于省略参数($arg1, $arg2, $arg4
)等小问题而言不那么易受攻击,而不是真正的解决方案。
弄清楚为什么函数需要那么多参数,然后解决这个问题。
有很多技巧,阅读一篇关于(oo)代码重构的好文章/书可以给你一些提示。