具有可选参数的PHP函数

use*_*826 94 php function parameter-passing

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

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

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

Rab*_*ott 60

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

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

function func($required, $requiredTwo, $optional) {
  if(isset($optional["param2"])) {
    doWork();
  }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*all 57

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


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

  • 真奇怪。php 中的内置函数可能有可选参数。那么为什么我们不能构建这样的函数呢? (2认同)
  • @Rodrigo 定义这样的函数绝对是可行的。不过,它们是位置可选的,这对于超出单个可选参数的任何内容来说都非常糟糕。 (2认同)

Kay*_*ose 44

为了达到你想要的效果,使用像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');
Run Code Online (Sandbox Code Playgroud)

但是,我经常发现当我开始用这么多参数编写一个函数/方法时 - 通常是代码气味,并且可以重新分解/抽象成更清洁的东西.

//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');
Run Code Online (Sandbox Code Playgroud)


Mat*_*ias 18

首先,PHP 8您可以使用命名参数

function namedParameters($paramOne, $paramTwo, $paramThree = 'test', $paramFour = null)
{
    dd($paramOne, $paramTwo, $paramThree, $paramFour);
}
Run Code Online (Sandbox Code Playgroud)

现在,我们可以使用参数调用此函数,required并且default使用我们希望与函数中指定的值不同的可选参数。

namedParameters('one', 'two', paramFour: 'four');
Run Code Online (Sandbox Code Playgroud)

结果:

// "one", "two", "test", "four"
Run Code Online (Sandbox Code Playgroud)


小智 12

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

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

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

echo sum(1, 2, 3, 4);
?>
Run Code Online (Sandbox Code Playgroud)

上面的例子将输出:

10
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*iro 10

注意:这是一个旧帖子,但现在或将来可以帮助某人.

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

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

如何使用

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";
}
Run Code Online (Sandbox Code Playgroud)

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


小智 9

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

<?php
function functionName($value, $value2 = null) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案,但请将 `null` 替换为日期类型的非位。例如数组的`array()` (2认同)