php 函数 可选参数,具有可选参数的PHP函数

具有可选参数的PHP函数

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

我的一个想法是传递带有参数数组的抽象函数,这些参数将它传递给实际函数。

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

11个解决方案

58 votes

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

$optional = array(

"param" => $param1,

"param2" => $param2

);

function func($required, $requiredTwo, $optional) {

if(isset($optional["param2"])) {

doWork();

}

}

Rabbott answered 2019-09-01T17:50:26Z

54 votes

使该函数采用一个参数:一个数组。 将实际参数作为数组中的值传递。

编辑:Pekka评论中的链接只是总结一下。

Matt Ball answered 2019-09-01T17:50:02Z

41 votes

为了达到你想要的效果,使用像Rabbot所说的阵列(尽管如果过度使用,这可能会成为记录/维护的痛苦)。 或者只使用传统的可选args。

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

Kayla Rose answered 2019-09-01T17:50:56Z

10 votes

注意:对于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";

}

我更喜欢第二种方法,因为它干净且易于理解,但有时您可能需要第一种方法。

Daniel Loureiro answered 2019-09-01T17:51:50Z

9 votes

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

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

function sum(...$numbers) {

$acc = 0;

foreach ($numbers as $n) {

$acc += $n;

}

return $acc;

}

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

?>

上面的例子将输出:

10

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

Mentos1386 answered 2019-09-01T17:52:33Z

7 votes

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

function functionName($value, $value2 = null) {

// do stuff

}

Blake Stevenson answered 2019-09-01T17:52:56Z

4 votes

我想,你也可以使用对象作为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!";

}

当然,你必须在这个函数中设置“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']."!";

}

psad answered 2019-09-01T17:53:31Z

2 votes

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

进一步阅读

Martin Fowler关于构造函数与Setter注入和

通过构造函数或属性设置器进行依赖注入?

Gordon answered 2019-09-01T17:54:14Z

2 votes

我知道这是一个老帖子,但我遇到了像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);

Chris answered 2019-09-01T17:55:16Z

0 votes

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

如果您使用的是不同的值,则有2个选项。

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

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

Alan Geleynse answered 2019-09-01T17:55:59Z

-2 votes

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

Flinsch answered 2019-09-01T17:56:16Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值