Php 如何才能更好地编写具有大量参数的函数?
我有这样一个函数:Php 如何才能更好地编写具有大量参数的函数?,php,function,parameter-passing,Php,Function,Parameter Passing,我有这样一个函数: public function myfunc ($arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8) { // do something } 看到了吗?我的函数有8个参数。是的,它也很管用,但你知道,它有点难看。。!难道没有更好的办法吗?例如,只传递一个数组就包含所有参数。可能吗?甚至类似的东西。我是这样做的 $params = []; 把东西放进去 $params[] = $a; $params[] =
public function myfunc ($arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8) {
// do something
}
看到了吗?我的函数有8个参数。是的,它也很管用,但你知道,它有点难看。。!难道没有更好的办法吗?例如,只传递一个数组就包含所有参数。可能吗?甚至类似的东西。我是这样做的
$params = [];
把东西放进去
$params[] = $a;
$params[] = $b;
将数组传递给函数
myFunction($params);
函数接受类似arg的数组,定义:
public function myFunction($params = []){}
把东西传进来,然后自己检查一下…我是这样做的
$params = [];
把东西放进去
$params[] = $a;
$params[] = $b;
将数组传递给函数
myFunction($params);
函数接受类似arg的数组,定义:
public function myFunction($params = []){}
传入一些内容,然后使用var_dump检查您自己…好的,现在我知道您正在执行的是SQL操作,那么最好的方法是关联数组(假设PDO和准备好的语句) 您可以使用包含正确参数的数组调用它:
$success = (bool) $obj -> myFunc (["val1" => "First value to insert",
"val2" => "Second value to insert",
"val3" => "Third value to insert"]);
好的,现在我知道您正在执行的是SQL操作,那么最好的方法是关联数组(假设PDO和准备好的语句) 您可以使用包含正确参数的数组调用它:
$success = (bool) $obj -> myFunc (["val1" => "First value to insert",
"val2" => "Second value to insert",
"val3" => "Third value to insert"]);
这取决于
myfunc
是否属于公开的api(即:public)
如果是公共的,则在更新基础模型(插入查询)时签名必须断开,否则将在客户端提交错误
有了数组,您就无法将模型映射到应用程序,而您只希望程序员向您发送正确的值。如果映射紧密/受限,则不会发生此类错误
我认为,如果要在数据库中保存项目,实际上需要所有这些字段。这确实是不合法的,但它不是反模式,因为它们都不是可选的。即使有一两个是,也不会引起关注
您可以采取以下措施来改进api:
public function myfunctosavedatainaparticularcase ($arg1, $arg2, $arg3, $arg4)
// do something
}
public function myfunctosavedatainanotherparticularcase ($arg5, $arg6, $arg7, $arg8)
// do something
}
public function myfunc (User $user)
// map fields to the User signature.
}
这取决于
myfunc
是否属于公开的api(即:public)
如果是公共的,则在更新基础模型(插入查询)时签名必须断开,否则将在客户端提交错误
有了数组,您就无法将模型映射到应用程序,而您只希望程序员向您发送正确的值。如果映射紧密/受限,则不会发生此类错误
我认为,如果要在数据库中保存项目,实际上需要所有这些字段。这确实是不合法的,但它不是反模式,因为它们都不是可选的。即使有一两个是,也不会引起关注
您可以采取以下措施来改进api:
public function myfunctosavedatainaparticularcase ($arg1, $arg2, $arg3, $arg4)
// do something
}
public function myfunctosavedatainanotherparticularcase ($arg5, $arg6, $arg7, $arg8)
// do something
}
public function myfunc (User $user)
// map fields to the User signature.
}
func\u get\u args()
您可以使用数组作为参数。对于试图做太多事情的函数来说,大量参数是一种代码味道。问自己几个问题:你的函数是否有超过20行的代码?它是否有超过2级的缩进?它是否包含3个以上的if/case/conditional语句?在循环中有循环吗?如果其中任何一个答案都是肯定的,那么如果将代码重构为多个函数而不是单个函数,那么您的代码可能会更好one@Mohammad只有当一系列相似的事情必须以相似的方式处理时,才应该这样做。你不应该用它来缩短参数列表@MartinAJ在这种情况下,关联数组是一个合适的参数(当然假设有一个准备好的语句!)func\u get\u args()
您可以使用数组作为参数。对于一个试图做太多事情的函数来说,大量参数是一种代码味道。问自己几个问题:你的函数是否有超过20行的代码?它是否有超过2级的缩进?它是否包含3个以上的if/case/conditional语句?在循环中有循环吗?如果其中任何一个答案都是肯定的,那么如果将代码重构为多个函数而不是单个函数,那么您的代码可能会更好one@Mohammad只有当它是一系列类似的东西时,你才应该这样做