我有一个带5个参数的函数,随着应用程序的增长,我们需要添加更多的参数,这些参数最终有9个参数,其中4个参数有默认值.
我想知道传递这样的参数或使用数组更好吗?
我更喜欢这样
fun(array(
'par1' => 'x',
'par2' => 'y',
.....
)
)
Run Code Online (Sandbox Code Playgroud)
绝缘
func($par1, $par2, $par3, ...);
Run Code Online (Sandbox Code Playgroud)
你怎么看?
Fle*_*der 11
但是这里有一些解决这个问题的方法.
如果订单有些修复而你永远不需要改变它,那么:
<?php
function fn($a1, $a2, $a3, $a4, $a5, $a6 = null, $a7 = "foo", $a8 = "bar", array $a9 = array()) {}
Run Code Online (Sandbox Code Playgroud)
优点
缺点
另一方面,如果订单总是有些不同,请使用数组thingy.
<?php
function fn($a1, $a2, $a3, $a4, $a5, array $optional = array()) {}
fn("", "", "", "", "", array("arg9" => false));
Run Code Online (Sandbox Code Playgroud)
优点
缺点
参数对象当然也是一种有效的解决方案,但处理起来却不切实际:
<?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);
Run Code Online (Sandbox Code Playgroud)
优点
缺点
你可以混合两种方法:
<?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));
Run Code Online (Sandbox Code Playgroud)
优点
缺点
PHP 5.6中有一个新功能,您可能会发现它很有用,可变参数:
<?php
function fn($a1, $a2, $a3, $a4, $a5, ...$optional) {}
Run Code Online (Sandbox Code Playgroud)
优点
缺点
我们将来可能会看到命名参数.
将9个参数传递给函数是一个清晰的代码气味:
参数太多:过程或函数中的一长串参数会使可读性和代码质量变差.
有了这么多参数,你很可能违反了:
长方法:方法,功能或过程变得过大.
创建将array这些参数组合在一起的任意组合将无法解决实际问题.它可以使您的代码更具可读性,并且对于诸如省略参数($arg1, $arg2, $arg4)之类的小问题而言不那么易受攻击,但不是真正的解决方案.
弄清楚为什么函数需要那么多参数,然后解决这个问题.
有很多技巧,阅读一篇关于(oo)代码重构的好文章/书可以给你一些提示.