在 PHP 中是否有一种干净的方法可以使用未定义的变量作为可选参数?
Is there a clean way to use undefined variables as optional parameters in PHP?
有什么好方法可以使用(可能)未定义的变量(比如来自外部输入)作为可选的函数参数吗?
<?php
$a = 1;
function foo($a, $b=2){
//do stuff
echo $a, $b;
}
foo($a, $b); //notice $b is undefined, optional value does not get used.
//output: 1
//this is even worse as other erros are also suppressed
@foo($a, $b); //output: 1
//this also does not work since $b is now explicitly declared as "null" and therefore the default value does not get used
$b ??= null;
foo($a,$b); //output: 1
//very,very ugly hack, but working:
$r = new ReflectionFunction('foo');
$b = $r->getParameters()[1]->getDefaultValue(); //still would have to check if $b is already set
foo($a,$b); //output: 12
到目前为止我能想到的唯一半有用的方法是不将默认值定义为参数,而是在实际函数中使用 "null" 作为中介,如下所示:
<?php
function bar ($c, $d=null){
$d ??= 4;
echo $c,$d;
}
$c = 3
$d ??= null;
bar($c,$d); //output: 34
但是使用这个我仍然必须检查参数两次:一次是在调用函数之前设置了参数,一次是函数内部是否为 null。
还有其他好的解决方案吗?
在这种情况下,理想情况下您不会通过 $b
。我不记得曾经 运行 遇到过我不知道变量是否存在并将其传递给函数的情况:
foo($a);
但要做到这一点,您需要确定如何调用该函数:
isset($b) ? foo($a, $b) : foo($a);
这有点骇人听闻,但如果您仍然需要参考,我们会创建它:
function foo($a, &$b){
$b = $b ?? 4;
var_dump($b);
}
$a = 1;
foo($a, $b);
如果这真的是一个要求,我会做这样的事情。
仅使用提供的值的总和进行测试只是为了显示示例。
<?php
$x = 1;
//Would generate notices but no error about $y and t
//Therefore I'm using @ to suppress these
@$sum = foo($x,$y,4,3,t);
echo 'Sum = ' . $sum;
function foo(... $arr) {
return array_sum($arr);
}
会输出...
Sum = 8
...基于给定的数组(参数的未知数... $arr)
array (size=5)
0 => int 1
1 => null
2 => int 4
3 => int 3
4 => string 't' (length=1)
array_sum()
这里只求和1,4和3 = 8.
即使上面的方法确实有效,我也不推荐它,因为这样一来,任何数据都可以发送到您的函数 foo()
,而您无法控制它。当涉及到任何类型的用户输入时,在使用来自用户的实际数据之前,您应该始终在代码中尽可能多地进行验证。
有什么好方法可以使用(可能)未定义的变量(比如来自外部输入)作为可选的函数参数吗?
<?php
$a = 1;
function foo($a, $b=2){
//do stuff
echo $a, $b;
}
foo($a, $b); //notice $b is undefined, optional value does not get used.
//output: 1
//this is even worse as other erros are also suppressed
@foo($a, $b); //output: 1
//this also does not work since $b is now explicitly declared as "null" and therefore the default value does not get used
$b ??= null;
foo($a,$b); //output: 1
//very,very ugly hack, but working:
$r = new ReflectionFunction('foo');
$b = $r->getParameters()[1]->getDefaultValue(); //still would have to check if $b is already set
foo($a,$b); //output: 12
到目前为止我能想到的唯一半有用的方法是不将默认值定义为参数,而是在实际函数中使用 "null" 作为中介,如下所示:
<?php
function bar ($c, $d=null){
$d ??= 4;
echo $c,$d;
}
$c = 3
$d ??= null;
bar($c,$d); //output: 34
但是使用这个我仍然必须检查参数两次:一次是在调用函数之前设置了参数,一次是函数内部是否为 null。
还有其他好的解决方案吗?
在这种情况下,理想情况下您不会通过 $b
。我不记得曾经 运行 遇到过我不知道变量是否存在并将其传递给函数的情况:
foo($a);
但要做到这一点,您需要确定如何调用该函数:
isset($b) ? foo($a, $b) : foo($a);
这有点骇人听闻,但如果您仍然需要参考,我们会创建它:
function foo($a, &$b){
$b = $b ?? 4;
var_dump($b);
}
$a = 1;
foo($a, $b);
如果这真的是一个要求,我会做这样的事情。 仅使用提供的值的总和进行测试只是为了显示示例。
<?php
$x = 1;
//Would generate notices but no error about $y and t
//Therefore I'm using @ to suppress these
@$sum = foo($x,$y,4,3,t);
echo 'Sum = ' . $sum;
function foo(... $arr) {
return array_sum($arr);
}
会输出...
Sum = 8
...基于给定的数组(参数的未知数... $arr)
array (size=5)
0 => int 1
1 => null
2 => int 4
3 => int 3
4 => string 't' (length=1)
array_sum()
这里只求和1,4和3 = 8.
即使上面的方法确实有效,我也不推荐它,因为这样一来,任何数据都可以发送到您的函数 foo()
,而您无法控制它。当涉及到任何类型的用户输入时,在使用来自用户的实际数据之前,您应该始终在代码中尽可能多地进行验证。