具有可选参数的PHP函数

时间:2010-10-20 14:29:34

标签: php function parameter-passing

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

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

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

15 个答案:

答案 0 :(得分:58)

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

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

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

答案 1 :(得分:54)

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


编辑: the link in Pekka's comment只是总结一下。

答案 2 :(得分:42)

要完成您想要的任务,请使用数组Like Rabbot said(但如果过度使用,这可能会成为记录/维护的痛苦)。或者只使用传统的可选参数。

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

答案 3 :(得分:10)

注意:这是 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";
}

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

答案 4 :(得分:9)

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

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

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

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

以上示例将输出:

10

Variable-length argument lists PHP Documentation

答案 5 :(得分:7)

您可以将默认值设置为null。

<?php
function functionName($value, $value2 = null) {
// do stuff
}

答案 6 :(得分:4)

我认为,您也可以将对象用作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”设置默认值,在其他情况下,您将获得“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']."!";
}

答案 7 :(得分:2)

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

进一步阅读

答案 8 :(得分:2)

我知道这是一篇很老的帖子,但我遇到的问题就像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);

答案 9 :(得分:0)

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

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

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

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

答案 10 :(得分:0)

PHP允许使用默认参数(link)。在您的情况下,可以根据功能代码将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;}
}

答案 11 :(得分:0)

只需将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" );

答案 12 :(得分:0)

PHP 8 开始,您可以使用 named arguments

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

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

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

结果:

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

答案 13 :(得分:-1)

function yourFunction($var1, $var2, $optional = Null){
   ... code
}

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

Null仍然是一个值,如果不使用该变量的值调用该函数,则该值不会为空,因此不会出错。

答案 14 :(得分:-2)

func( "1", "2", default, default, default, default, default, "eight" );
相关问题