Функция PHP с необязательными параметрами - PullRequest
94 голосов
/ 20 октября 2010

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

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

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

Ответы [ 12 ]

60 голосов
/ 20 октября 2010

В данном случае я передал массив, где ключ - это имя параметра, а значение - это значение.

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

function func($required, $requiredTwo, $optional) {
  if(isset($optional["param2"])) {
    doWork();
  }
}
56 голосов
/ 20 октября 2010

Заставить функцию принимать один параметр: массив.Передайте действительные параметры в виде значений в массиве.


Редактировать: ссылка в комментарии Пекки почти суммирует ее.

42 голосов
/ 20 октября 2010

Чтобы выполнить то, что вы хотите, используйте массив Как сказал Раббот (хотя это может стать проблемой для документирования / поддержки при чрезмерном использовании). Или просто используйте традиционные необязательные аргументы.

//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');
10 голосов
/ 16 марта 2016

В PHP 5.6 и более поздних версиях списки аргументов могут включать токен ..., обозначающий, что функция принимает переменное число аргументов.Аргументы будут переданы в данную переменную в виде массива;например:

Пример Использование ... для доступа к переменным аргументам

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

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

В приведенном выше примере будут выведены:

10

списки аргументов переменной длиныДокументация PHP

10 голосов
/ 30 апреля 2013

ПРИМЕЧАНИЕ. Это старый ответ для PHP 5.5 и ниже. PHP 5.6+ поддерживает аргументы по умолчанию

В PHP 5.5 и ниже вы можете достичь этого, используя один из следующих 2 методов:

  • с использованием функций 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";
}

Я предпочитаю второй метод, потому что он чистый и простой для понимания, но иногда вам может понадобиться первый метод.

8 голосов
/ 30 апреля 2018

Вы можете просто установить значение по умолчанию на ноль.

<?php
function functionName($value, $value2 = null) {
// do stuff
}
4 голосов
/ 28 мая 2014

Я думаю, вы также можете использовать объекты в качестве params-транспорта.

$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']."!";
}
2 голосов
/ 11 марта 2013

Я знаю, что это старый пост, но у меня была такая проблема, как ОП, и это то, что я придумал.

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

$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);
2 голосов
/ 20 октября 2010

Если для создания объекта с допустимым состоянием требуются только два значения, вы можете просто удалить все остальные необязательные аргументы и предоставить для них установщики (если вы не хотите, чтобы они изменялись во время выполнения).Затем просто создайте экземпляр объекта с двумя необходимыми аргументами и установите другие необходимые значения с помощью установщика.

Дальнейшее чтение

0 голосов
/ 14 июня 2019
function yourFunction($var1, $var2, $optional = Null){
   ... code
}

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

Значение Null по-прежнему равно значению, если вы не вызовете функцию со значением для этой переменной, оно не будет пустым, поэтому без ошибок.

...