这似乎是我所知道的一个基本问题,但我找不到答案。
让我们假设一个基本功能:
function basicFunction ( $var1, $var2 = 1, $var3 = 2, $var4 = 5 )
{
// Do some stuff
// Return
}
现在让我们假设我想用以下变量调用该函数:
$var1 = 0
$var2 = 1
$var3 = 2
$var4 = 3
我可以这样做:
$someResult = basicFunction( 0, 1, 2, 3 );
$var2
和$var3
已经设置了,那么如何调用该函数而不必重复$var2
和$var3
的值?
答案 0 :(得分:4)
PHP不支持重载。因此,如果您不将它们移动到参数列表的右侧,则不能以任何方式跳过它们。
常见的解决方案是设置与预期不同类型的默认值(即NULL)。然后在函数内设置实际默认值。这种方法不是很干净,需要一些额外的代码,但如果情况需要,你可以使用它:
function basicFunction($var1, $var2 = NULL, $var3 = NULL, $var4 = NULL) {
if ($var2 === NULL) {
$var2 = 1;
}
// ...
答案 1 :(得分:0)
不幸的是,我不认为php就是这样的
如果您要更改$var4
,则必须包含$var2
和$var3
,因为它们位于函数声明中的$var4
之前。
您可以使用默认值将数组传递给函数,并仅更改$var4
值,或将订单更改为建议的nick。
http://www.php.net/manual/en/functions.arguments.php#functions.arguments.default
答案 2 :(得分:0)
您需要将$var2
和$var3
放在参数列表的末尾
function basicFunction ( $var1, $var4 = 5, $var2 = 1, $var3 = 2)
现在你可以致电:
basicFunction( 0, 3);
否则您必须指定所有参数。调用函数时,必须从左到右指定所有参数。您可以省略参数的唯一时间是:
答案 3 :(得分:0)
您是否考虑过以某种方式将变量作为数组传递? 在这种情况下,您只包含需要更新的变量
function basicFunction ( $arrayvar ){
$arrayvar['var1']...
更新:您也可以使用与the first feature here
类似的func_get_args()
- 函数
答案 4 :(得分:0)
我刚刚编写了这个函数,可以通过关联数组调用函数。我只是在标量类型上进行了测试,但它应该适用于接收ints
,floats
,strings
和booleans
的函数。我写得非常快,绝对可以通过多种方式改进:
function call_user_func_assoc($function, $array){
$matches = array();
$result = array();
$length = preg_match_all('/Parameter #(\d+) \[ <(required|optional)> \$(\w+)(?: = (.*))? ]/', new ReflectionFunction($function), $matches);
for($i = 0; $i < $length; $i++){
if(isset($array[$matches[3][$i]]))
$result[$i] = $array[$matches[3][$i]];
else if($matches[2][$i] == 'optional')
$result[$i] = eval('return ' . $matches[4][$i] . ';');
else
throw new ErrorException('Missing required parameter: $' . $matches[3][$i]);
}
call_user_func_array($function, $result);
}
你可以像这样使用它:
function basicFunction($var1, $var2 = "default string", $var3 = 2, $var4 = 5){
var_dump(func_get_args());
}
call_user_func_assoc('basicFunction', array('var1' => "Bob", 'var4' => 30));
哪个输出:
array(4) {
[0]=>
string(3) "Bob"
[1]=>
string(14) "default string"
[2]=>
int(2)
[3]=>
int(30)
}
答案 5 :(得分:0)
<?php
function my_function(
$id,
$start = 0,
$limit = 10,
$filter = false,
$include_duplicates => false,
$optimize_fetch => false,
$cache = false
) {
if (is_array($id)) extract($id, EXTR_IF_EXISTS);
/* ... */
}
然后
<?php
my_function(array('id' => 1, 'cache' => true));
来源:http://www.marco.org/2008/11/11/faking-named-parameters-in-php
答案 6 :(得分:0)
更纯的代码4你(工作100%,php&gt; 5.3),使用类和函数。
function call_user_func_assoc($function, $array){
if ((is_string($function)) && (count(explode('::',$function))>1))
$function = explode('::',$function);
$func = ((is_array($function)) || (count($function)>1)) ? new ReflectionMethod($function[0], $function[1]) : new ReflectionFunction($function);
foreach($func->getParameters() as $key => $param) {
if (isset($array[$key]))
$result[$key] = $array[$key];
elseif(isset($array[$param->name]))
$result[$key] = $array[$param->name];
else
$result[$key] = $param->getDefaultValue();
}
return call_user_func_array($function, $result);
}
答案 7 :(得分:-1)
跳过值尝试这样
$someResult = basicFunction( 0, 0, 0, 3 );
或者如果您设置了值
// passing values stored in var2,var3
$var1 = 1;
$var2 = 2;
$someResult = basicFunction( 0, $var1, $var2, 3 );
答案 8 :(得分:-1)
正如我在上面的评论中所提到的,你应该始终将可选变量保留在右端,因为php参数从左到右进行评估。但是,对于这种情况,你可以做一些技巧来摆脱重复的值,如下所示:
$var2 = 1, $var3 = 2, $var4 = 5;
function basicFunction($var1, $var2 = null, $var3 = null, $var4 = null) {
if($var2 === null)
$var2 = $GLOBALS["var2"];
if($var3 === null)
$var3 = $GLOBALS["var3"];
if($var4 === null)
$var4 = $GLOBALS["var4"];
}
但是,您最好通过巧妙地重新定位参数来解决这种情况。