具有可选参数的PHP函数

我写了一个PHP函数,可以接受10个参数,但只有2个是必需的。 有时,我想定义第八个参数,但是我不想为每个参数input空string,直到达到第八个参数。

我有一个想法是传递一个抽象函数与一个参数数组传递给实际function。

有没有更好的方法来设置function,所以我只能传入我想要的参数?

使函数有一个参数:一个数组。 将实际参数作为数组中的值传入。


编辑: 佩卡的评论中的链接就是总结它。

我在这种情况下所做的是传递一个数组,其中键是参数名称,值是值。

$optional = array( "param" => $param1, "param2" => $param2 ); function func($required, $requiredTwo, $optional) { if(isset($optional["param2"])) { doWork(); } } 

为了实现你想要的, 像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'); 

检查PHP文档中的默认参数值 。

注意:这是一个旧的post,但可以帮助现在或将来的人。

您可以通过使用以下两种方法之一来实现此目的:

  • 使用func_num_args()func_get_arg()函数;
  • 使用默认参数;

如何使用

 function method_1() { $arg1 = (func_num_args() >= 1)? func_get_arg(0): "default_value_fot_arg1"; $arg2 = (func_num_args() >= 2)? func_get_arg(1): "default_value_fot_arg2"; } function method_2($arg1 = null, $arg2 = null) { $arg1 = $arg1? $arg1: "default_value_fot_arg1"; $arg2 = $arg2? $arg2: "default_value_fot_arg2"; } 

我更喜欢第二种方法,因为它很干净而且容易理解,但是有时候你可能需要第一种方法。

在PHP 5.6和更高版本中,参数列表可能包含…标记以表示该函数接受可变数目的参数。 参数将作为数组传递给给定的variables; 例如:

示例使用…访问variables参数

 <?php function sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; } echo sum(1, 2, 3, 4); ?> 

上面的例子会输出:

 10 

可变长度参数列出了PHP文档

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

进一步阅读

  • 马丁福勒build设者与二传手注入和
  • 通过构造函数或属性设置程序进行dependency injection?

我知道这是一个旧的post,但我有一个像OP一样的问题,这就是我想出来的。

你可以传递数组的例子。 如果需要一个特定的命令,你可以重新命令这个命令,但是对于这个问题,这将会执行所要求的命令。

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

这是易于pipe理的,易于阅读,数据提取点可以在编码的任何地方随时添加和删除,并且仍然避免大量重写。 我用整数键与OP原来的问题相符,但string键可以很容易地使用。 事实上,为了可读性,我会build议。

将其放在外部文件中以方便使用

 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; 

最后通过arrays

 unknown_number_arguments($argument_set); 

我想,你也可以使用对象作为params-transportes。

 $myParam = new stdClass(); $myParam->optParam2 = 'something'; $myParam->optParam8 = 3; theFunction($myParam); function theFunction($fparam){ return "I got ".$fparam->optParam8." of ".$fparam->optParam2." received!"; } 

对于cource,你必须在这个函数中设置“optParam8”和“optParam2”的默认值,否则你会得到“Notice:Undefined property: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']."!"; } 

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

如果你使用不同的值,你有2个选项。

一个是创build一组包装函数,它们采用不同的参数,并在其他设置上设置默认值。 如果只使用几个组合,这很有用,但可能会很快变得非常混乱。

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

 func( "1", "2", default, default, default, default, default, "eight" );