PHP: определить функцию с переменным количеством параметров? - PullRequest
12 голосов
/ 22 января 2010

Есть ли способ определить функцию в PHP, которая позволяет определять переменное количество параметров?

на языке, с которым я больше знаком, это так:

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

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

Спасибо!

Ответы [ 6 ]

33 голосов
/ 22 января 2010

Да. Используйте func_num_args() и func_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");
?>
6 голосов
/ 22 января 2010

Вы можете принять переменное число аргументов для любой функции, если их достаточно для заполнения всех объявленных аргументов.

<?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"

?>
3 голосов
/ 13 марта 2015

Хотя этот вопрос очень старый: на самом деле в PHP 5.6+ вы можете точно написать то, что написали: D

2 голосов
/ 17 июня 2014

или просто

function printArgs() {

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

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

выходы 1 2 three

1 голос
/ 06 апреля 2010

Мне нравится подход Javascript-esque с моими параметрами PHP. Это позволяет лучше настраивать «опции» и их значения по умолчанию (которые я сейчас расскажу). Например, допустим, у вас есть функция, которая возвращает диапазон в массиве. Параметр 1 - время начала, параметр 2 - время окончания, параметр 3 - временной интервал, и любая опция после этого является необязательной (например, «format» => «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);

Это позволяет установить значения по умолчанию в функции, которые затем могут быть переопределены, что довольно круто. Конечно, вы должны позаботиться о том, чтобы странные, неиспользованные опции не были переданы, но я оставлю это вам. :)

0 голосов
/ 22 января 2010

Я бы посоветовал вам передать массив в вашу функцию, чтобы вы могли хранить как можно больше различных параметров в этом массиве. Есть много операций, которые вы можете выполнить с массивом, как только он окажется в функции, для получения нужной вам необходимой информации.

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

myFunction($array);
...