我试图避免这种情况:
function do_something($arg1, $arg2, $arg3, $arg4, $arg5) {
function do_something_else($arg1, $arg2, $arg3, $arg4, $arg5) {
// code
}
do_something_else($arg1, $arg2, $arg3, $arg4, $arg5);
// do other things with the args
}
也就是说,反复重复args,特别是在有很多args的情况下。在这个例子中,我需要在主do_something函数中有一个名为do_something_else的嵌套函数。嵌套函数还使用传递给它父级的所有相同的args。所以我必须将它们传递给它,并在实际执行do_something函数时再次重复所有这些参数。
有更清洁的方法来处理这个问题吗?我知道内置的php函数func_get_args()
返回一个函数内部所有参数的数组,但是如何将这些参数传递给子函数,以便它们在那里也可用,基本上寻找一种方法来做到这一点而不重复args这么多次?
答案 0 :(得分:3)
将您的参数放在一个对象中。
答案 1 :(得分:2)
你已经说过了。为简单起见,您可以使用func_get_args()
。将其与call_user_func_array()
结合使用即可:
call_user_func_array("do_something_else", func_get_args());
实际上有一个小警告。这只适用于PHP 5.3及更高版本。在此之前,您需要一个临时变量:
$args = func_get_args();
call_user_func_array("do_something_else", $args);
所以,它真的不简洁。但它已经显示了替代方案:只需优化函数签名以使用数组中的参数。
答案 2 :(得分:1)
function do_something($arg1, $arg2, $arg3, $arg4, $arg5) {
function do_something_else($arg1, $arg2, $arg3, $arg4, $arg5) {
echo $arg5;
}
call_user_func_array('do_something_else', func_get_args());
}
这样只会省去一次重复,即调用do_something_else
函数。
答案 3 :(得分:1)
您可以使用数据传输对象(DTO)。 DTO是一种数据结构(结构或类),用于在层或函数之间传输数据。
答案 4 :(得分:0)
对于嵌套函数,您还可以使用“use”关键字让闭包使用周围上下文中的变量。我经常这样做:
$function = function($var) use ($context1, $context2) {
// code
}
$function($input1);
$function($input2);
确实需要PHP 5.3或更高版本。
答案 5 :(得分:0)
您可以随时传递关联的数组。允许灵活性。
function sample($data = array()) {
print_r($data);
}
sample(array('id'=>123.'category'=>'tv'));
答案 6 :(得分:-1)
您基本上可以通过提及func_get_args()
给出答案。
function do_something($arg1, $arg2, $arg3, $arg4, $arg5) {
function do_something_else($args) {
// code
}
do_something_else(func_get_args());
// do other things with the args
}