带可选参数的 PHP 函数

我编写了一个 PHP 函数,它可以接受10个参数,但只需要2个。有时,我想定义第八个参数,但是我不想为每个参数输入空字符串,直到我到达第八个参数。

我的一个想法是传递一个带有参数数组的抽象函数,然后将其传递给实际函数。

有没有更好的方法来设置函数,这样我就可以只传入我想要的参数?

249416 次浏览

让函数只接受一个参数: 一个数组。将实际参数作为数组中的值传入。


编辑: 佩卡评论中的链接对此进行了总结。

在本例中,我所做的是传递一个数组,其中键是参数名,值是值。

$optional = array(
"param" => $param1,
"param2" => $param2
);


function func($required, $requiredTwo, $optional) {
if(isset($optional["param2"])) {
doWork();
}
}
func( "1", "2", default, default, default, default, default, "eight" );

如果您通常只是传递第8个值,那么可以重新排序参数,使其成为第一个。您只需要指定参数,直到您想要设置的最后一个参数为止。

如果使用不同的值,则有两个选项。

一种方法是创建一组包装函数,这些函数采用不同的参数并设置其他参数的默认值。如果您只使用几种组合,那么这种方法非常有用,但是可能会很快变得非常混乱。

另一个选项是传递一个数组,其中键是参数的名称。然后,您可以检查数组中是否有带键的值,如果没有,则使用默认值。但是,如果您有很多参数,那么这会变得很麻烦,并且会添加很多额外的代码。

要完成您想要的任务,可以使用数组 就像 Rabbot 说的(尽管如果过度使用,这可能会成为文档/维护的麻烦)。或者使用传统的可选参数。

//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');

如果创建具有有效状态的对象只需要两个值,那么您可以简单地删除所有其他可选参数并为它们提供 setter (除非您不希望它们在运行时发生更改)。然后用两个必需的参数实例化对象,并通过 setter 根据需要设置其他参数。

进一步阅读

我知道这是一个老职位,但我有一个问题,喜欢的 OP 和这是我想出来的。

可以传递的数组示例。如果需要特定的订单,您可以重新订购它,但是对于这个问题,它将按要求执行。

$argument_set = array (8 => 'lots', 5 => 'of', 1 => 'data', 2 => 'here');

这是可管理的,易于阅读和数据提取点可以添加和删除的时刻通知任何地方的编码,仍然避免大规模重写。我使用整数键来符合 OP 原始问题,但是字符串键也可以很容易地使用。事实上,为了便于阅读,我建议你这样做。

为了方便,把这个放在外部文件中

function unknown_number_arguments($argument_set) {


foreach ($argument_set as $key => $value) {


# create a switch with all the cases you need. as you loop the array
# keys only your submitted $keys values will be found with the switch.
switch ($key) {
case 1:
# do stuff with $value
break;
case 2:
# do stuff with $value;
break;
case 3:
# key 3 omitted, this wont execute
break;
case 5:
# do stuff with $value;
break;
case 8:
# do stuff with $value;
break;
default:
# no match from the array, do error logging?
break;
}
}
return;
}

如果文件。

$argument_set = array();

只要使用这些来分配下一块数据使用编号/命名根据来自哪里的数据。

$argument_set[1][] = $some_variable;

最后传递数组

unknown_number_arguments($argument_set);

注意: 对于 PHP 5.5及以下版本,这是一个老的答案。 PHP 5.6 + 支持默认参数

在 PHP 5.5及以下版本中,您可以通过使用以下两种方法之一来实现这一点:

  • 使用 Func _ num _ args ()Func _ get _ arg ()函数;
  • 使用 NULL 参数;

怎么用

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";
}

我更喜欢第二种方法,因为它简洁易懂,但有时可能需要第一种方法。

我认为,你也可以使用对象作为参数传送器。

$myParam = new stdClass();
$myParam->optParam2 = 'something';
$myParam->optParam8 = 3;
theFunction($myParam);


function theFunction($fparam){
return "I got ".$fparam->optParam8." of ".$fparam->optParam2." received!";
}

当然,您必须在这个函数中为“ optParam8”和“ optParam2”设置默认值,在其他情况下,您将得到“注意: 未定义属性: stdClass: : $optParam2”

如果使用数组作为函数参数,我喜欢这样设置默认值:

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 5.6及更高版本中,参数列表可能包含... 标记,以表示函数接受数量可变的参数。参数将作为数组传递给给定的变量; 例如:

示例使用... 来访问变量参数

<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}


echo sum(1, 2, 3, 4);
?>

上面的例子将输出:

10

变长参数列出 PHP 文档

只需将默认值设置为 null 即可。

<?php
function functionName($value, $value2 = null) {
// do stuff
}
function yourFunction($var1, $var2, $optional = Null){
... code
}

您可以创建一个常规函数,然后通过给它们一个默认的 Null 值来添加可选变量。

Null 仍然是一个值,如果你不调用带有该变量值的函数,它就不会是空的,所以没有错误。

PHP 允许默认参数(链接)。在您的示例中,可以根据函数代码将3到8之间的所有参数定义为 NULL 或空字符串“”。通过这种方式,只能使用前两个参数调用函数。

例如:

<?php
function yourFunction($arg1, $arg2, $arg3=NULL, $arg4=NULL, $arg5=NULL, $arg6=NULL, $arg7=NULL, $arg8=NULL){
echo $arg1;
echo $arg2;
if(isset($arg3)){echo $arg3;}
# other similar statements for $arg4, ...., $arg5
if(isset($arg8)){echo $arg8;}
}

只需将 Null 设置为忽略您不想使用的参数,然后根据位置设置所需的参数。

 function myFunc($p1,$p2,$p3=Null,$p4=Null,$p5=Null,$p6=Null,$p7=Null,$p8=Null){
for ($i=1; $i<9; $i++){
$varName = "p$i";
if (isset($$varName)){
echo $varName." = ".$$varName."<br>\n";
}
}
}


myFunc( "1", "2", Null, Null, Null, Null, Null, "eight" );

PHP 8开始,你可以使用 命名论点:

function namedParameters($paramOne, $paramTwo, $paramThree = 'test', $paramFour = null)
{
dd($paramOne, $paramTwo, $paramThree, $paramFour);
}

现在我们可以用 required参数和 只有参数来调用这个函数,我们希望它不同于函数中指定的 default值。

namedParameters('one', 'two', paramFour: 'four');

结果:

// "one", "two", "test", "four"

从 PHP 7.1.0开始,类型声明可以通过在类型名前面加一个问号(?)来标记为空.这表示该值可以是指定类型或 null

<?php
function name(?string $varname){
echo is_null($varname);
}
name();
name('hey');
?>

更多信息: 点击这里