我编写了一个可以接受10个参数的PHP函数,但只有2个是必需的。有时候,我想定义第8个参数,但不想为每个参数键入空字符串直到我到达第8个参数。
我想到的一个方法是传递一个带有数组参数的抽象函数,然后将其传递给真实函数。
是否有更好的方法来设置函数,以便只能传递我想要的参数?
我编写了一个可以接受10个参数的PHP函数,但只有2个是必需的。有时候,我想定义第8个参数,但不想为每个参数键入空字符串直到我到达第8个参数。
我想到的一个方法是传递一个带有数组参数的抽象函数,然后将其传递给真实函数。
是否有更好的方法来设置函数,以便只能传递我想要的参数?
在这种情况下,我所做的是传递一个数组,其中键是参数名称,而值是参数值。
$optional = array(
"param" => $param1,
"param2" => $param2
);
function func($required, $requiredTwo, $optional) {
if(isset($optional["param2"])) {
doWork();
}
}
//My function with tons of optional params
function my_func($req_a, $req_b, $opt_a = NULL, $opt_b = NULL, $opt_c = NULL)
{
//Do stuff
}
my_func('Hi', 'World', null, null, 'Red');
然而,我通常会发现,当我开始编写一个具有那么多参数的函数/方法时,往往是代码异味,可以重构/抽象成更清晰的东西。
//Specialization of my_func - assuming my_func itself cannot be refactored
function my_color_func($reg_a, $reg_b, $opt = 'Red')
{
return my_func($reg_a, $reg_b, null, null, $opt);
}
my_color_func('Hi', 'World');
my_color_func('Hello', 'Universe', 'Green');
您可以将默认值设置为null。
<?php
function functionName($value, $value2 = null) {
// do stuff
}
null
。例如,对于数组,请使用array()
。 - Mohamed hesham<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
以上示例将输出:
10
从 PHP 8
开始,你可以使用命名参数:
function namedParameters($paramOne, $paramTwo, $paramThree = 'test', $paramFour = null)
{
dd($paramOne, $paramTwo, $paramThree, $paramFour);
}
我们现在可以使用 required
参数以及我们想要与函数中指定的默认值不同的 可选参数 来调用此函数。
namedParameters('one', 'two', paramFour: 'four');
结果:
// "one", "two", "test", "four"
注意:这是一个针对PHP 5.5及以下版本的旧答案。 PHP 5.6+ 支持默认参数。
在 PHP 5.5 及以下版本中,您可以使用以下两种方法之一来实现此目的:
function method_1()
{
$arg1 = (func_num_args() >= 1)? func_get_arg(0): "default_value_for_arg1";
$arg2 = (func_num_args() >= 2)? func_get_arg(1): "default_value_for_arg2";
}
function method_2($arg1 = null, $arg2 = null)
{
$arg1 = $arg1? $arg1: "default_value_for_arg1";
$arg2 = $arg2? $arg2: "default_value_for_arg2";
}
我更喜欢第二种方法,因为它干净易懂,但有时可能需要用第一种方法。
$x = null; if ($x) echo "true"; else echo "false";
将打印出"false",即使$x变量有一个值(在此代码中为"null")。另外,在两种方法中我们都使用了三元运算符,所以只使用一个"="是正确的。如果你用method(); method(1); method(1, 2);
测试,那么第一次调用将把arg1和arg2与默认值关联起来,第二次调用将把第二个arg与默认值关联起来,并把"1"赋给第一个arg。最后一次调用将不关联默认值。 - Daniel Loureiro$myParam = new stdClass();
$myParam->optParam2 = 'something';
$myParam->optParam8 = 3;
theFunction($myParam);
function theFunction($fparam){
return "I got ".$fparam->optParam8." of ".$fparam->optParam2." received!";
}
function theFunction($fparam){
$default = array(
'opt1' => 'nothing',
'opt2' => 1
);
if(is_array($fparam)){
$fparam = array_merge($default, $fparam);
}else{
$fparam = $default;
}
//now, the default values are overwritten by these passed by $fparam
return "I received ".$fparam['opt1']." and ".$fparam['opt2']."!";
}
<?php
function name(?string $varname){
echo is_null($varname);
}
name();
name('hey');
?>
更多信息请参考:点击这里
function yourFunction($var1, $var2, $optional = Null){
... code
}