计算PHP中缺少的函数参数

时间:2012-05-04 10:39:29

标签: php

是否可以在PHP函数中计算缺少的参数?我想这样做:

// I have this
function foo($param1, $param2, $param3) {
    // I need some sort of argument counter
}

foo("hello", "world");

当我使用上面的foo函数时,我想找到一种方法来找出并非所有参数都被使用。

通过计算所有参数并与get_defined_vars()进行比较,或者使用一个函数来计算缺少参数的数量。

编辑: 如果在启用error_reporting时缺少某些参数,我需要该方法停止运行。

if(!foo($param)) { echo "Couldn't Foo!"; }

5 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

如果你想做这个超级动态的,使用反射来获得预期的参数计数,并将该数字与func_num_args()返回的数字进行比较:

function foo($p1 = null, $p2 = null, $p3 = null) {
    $refl = new ReflectionFunction(__FUNCTION__);

    $actualNumArgs = func_num_args();
    $expectedNumArgs = $refl->getNumberOfParameters();

    $numMissingArgs = $expectedNumArgs - $actualNumArgs;

    // ...

答案 2 :(得分:1)

调用参数不足的函数会引发错误。如果需要允许调用带有较少参数的函数,则需要在函数声明中使用默认值定义它们,并测试默认值以查看哪些已被省略。

这样的事情(再次提出):

function foo () {

  // Names of possible function arguments
  // This replaces the list of arguments in the function definition parenthesis
  $argList = array('param1', 'param2', 'param3');

  // Actual function arguments
  $args = func_get_args();

  // The number of omitted arguments
  $omittedArgs = 0;

  // Loop the list of expected arguments
  for ($i = 0; isset($argList[$i]); $i++) {
    if (!isset($args[$i])) { // The argument was omitted - this also allows you to skip arguments with NULL since NULL is not counted as set
      // increment the counter and create a NULL variable in the local scope
      $omittedArgs++;
      ${$argList[$i]} = NULL;
    } else {
      // The argument was passed, create a variable in the local scope
      ${$argList[$i]} = $args[$i];
    }
  }

  // Function code goes here
  var_dump($omittedArgs);

}

这对于可能维护代码的其他人来说有点直觉 - 参数列表现在被维护为字符串数组而不是函数参数列表,但除此之外是完全动态的并且实现了你想要的。

答案 3 :(得分:0)

根据您的需要,最简单的解决方案可能是默认参数:

function foo($param1 = null, $param2 = null, $param3 = null) {
  if ($param3 !== null) {
    // 3 params are specified
  } else if ($param2 !== null) {
    // 2 params are specified
  } else if ($param1 !== null) {
    // 1 param is specified
  } else {
    // no param is specified
  }
}

答案 4 :(得分:0)