14

有没有办法在 PHP 中定义一个函数,让您定义可变数量的参数?

在我更熟悉的语言中是这样的:

function myFunction(...rest){ /* rest == array of params */ return rest.length; }

myFunction("foo","bar"); // returns 2;

谢谢!

4

6 回答 6

36

是的。使用func_num_args()andfunc_get_arg()获取参数:

<?php
  function dynamic_args() {
      echo "Number of arguments: " . func_num_args() . "<br />";
      for($i = 0 ; $i < func_num_args(); $i++) {
          echo "Argument $i = " . func_get_arg($i) . "<br />";
      }
  }

  dynamic_args("a", "b", "c", "d", "e");
?>

在 PHP 5.6+ 中,您现在可以使用可变参数函数

<?php
  function dynamic_args(...$args) {
      echo "Number of arguments: " . count($args) . "<br />";
      foreach ($args as $arg) {
          echo $arg . "<br />";
      }
  }

  dynamic_args("a", "b", "c", "d", "e");
?>
于 2010-01-22T14:43:41.850 回答
6

您可以为任何函数接受可变数量的参数,只要有足够的参数来填充所有声明的参数。

<?php

function test ($a, $b) { }

test(3); // error
test(4, 5); // ok
test(6,7,8,9) // ok

?>

要访问传递给 的额外未命名参数test(),请使用函数func_get_args()func_num_args()func_get_arg($i)

<?php

// Requires at least one param, $arg1
function test($arg1) {

  // func_get_args() returns all arguments passed, in order.
  $args = func_get_args();

  // func_num_args() returns the number of arguments
  assert(count($args) == func_num_args());

  // func_get_arg($n) returns the n'th argument, and the arguments returned by
  // these functions always include those named explicitly, $arg1 in this case
  assert(func_get_arg(0) == $arg1);

  echo func_num_args(), "\n";
  echo implode(" & ", $args), "\n";

}

test(1,2,3); // echo "1 & 2 & 3"

?>
于 2010-01-22T14:45:47.807 回答
3

尽管这个问题很老了:实际上在 PHP 5.6+ 中,您可以准确地写出您所写的内容:D

于 2015-03-12T22:14:01.330 回答
2

要不就

function printArgs() {

 foreach (func_get_args () as $arg){
  echo $arg;
 }
}

printArgs("1 ", "2 ", "three ");

输出1 2 three

于 2014-06-17T05:13:03.590 回答
1

我喜欢对我的 PHP 参数采用 Javascript 式的方法。这允许更好地设置“选项”及其默认值(我将立即查看)。例如,假设您有一个函数返回数组中的时间范围。参数 1 是开始时间,参数 2 是结束时间,参数 3 是时间间隔,之后的任何选项都是可选的(如“格式”=>“24 小时”、“include_seconds”=> TRUE 等。 )。

我会这样定义函数:

function returnTimeInterval($startTime, $endTime, $interval, $options = array())
{
    // the first thing to do is merge options in with our defaults
    $options = array_merge(array(
        "format" => "24-hour",
        "include_seconds => TRUE
        // etc.
    ), $options);

这允许在函数中设置默认值,然后可以覆盖,这非常酷。当然,你需要注意不要传入奇怪的、未使用的选项,但我会把它留给你。:)

于 2010-04-06T00:36:19.557 回答
0

我鼓励您将一个数组传递给您的函数,这样您就可以在该数组中存储尽可能多的不同参数。一旦它在函数中,您可以对数组进行许多操作以获得所需的正确信息。

$array = array();
$array[0] = "a";
$array[1] = 1;

myFunction($array);
于 2010-01-22T14:45:41.523 回答