programing

선택적 매개 변수가있는 PHP 함수

nasanasas 2020. 8. 28. 07:34
반응형

선택적 매개 변수가있는 PHP 함수


10 개의 매개 변수를받을 수있는 PHP 함수를 작성했지만 2 개만 필요합니다. 때로는 8 번째 매개 변수를 정의하고 싶지만 8 번째에 도달 할 때까지 각 매개 변수에 대해 빈 문자열을 입력하고 싶지 않습니다.

내가 가진 한 가지 아이디어는 실제 함수에 전달하는 매개 변수 배열로 추상화 된 함수를 전달하는 것이 었습니다.

원하는 매개 변수 만 전달할 수 있도록 함수를 설정하는 더 좋은 방법이 있습니까?


함수가 하나의 매개 변수 인 배열을 취하도록합니다. 실제 매개 변수를 배열의 값으로 전달하십시오.


편집 : Pekka의 의견에있는 링크가 요약합니다.


이 경우 내가 한 일은 배열을 전달하는 것입니다. 여기서 키는 매개 변수 이름이고 값은 값입니다.

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

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

원하는 것을 달성하려면 Rabbot이 말한 것처럼 배열을 사용하십시오 (과도하게 사용하면 문서화 / 유지 관리가 어려울 수 있음). 또는 전통적인 선택적 인수를 사용하십시오.

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

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 문서


참고 : 이것은 PHP 5.5 이하에 대한 오래된 답변 입니다. PHP 5.6 이상은 기본 인수를 지원합니다.

PHP 5.5 이하에서는 다음 두 가지 방법 중 하나를 사용하여이를 수행 할 수 있습니다.

  • 은 USING 는 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";
}

두 번째 방법은 깨끗하고 이해하기 쉽기 때문에 선호하지만 때로는 첫 번째 방법이 필요할 수 있습니다.


기본값을 null로 설정할 수 있습니다.

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

객체를 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']."!";
}

If only two values are required to create the object with a valid state, you could simply remove all the other optional arguments and provide setters for them (unless you dont want them to changed at runtime). Then just instantiate the object with the two required arguments and set the others as needed through the setter.

Further reading


I know this is an old post, but i was having a problem like the OP and this is what i came up with.

Example of array you could pass. You could re order this if a particular order was required, but for this question this will do what is asked.

$argument_set = array (8 => 'lots', 5 => 'of', 1 => 'data', 2 => 'here');

This is manageable, easy to read and the data extraction points can be added and removed at a moments notice anywhere in coding and still avoid a massive rewrite. I used integer keys to tally with the OP original question but string keys could be used just as easily. In fact for readability I would advise it.

Stick this in an external file for ease

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;
}

put this at the start if the file.

$argument_set = array(); 

Just use these to assign the next piece of data use numbering/naming according to where the data is coming from.

$argument_set[1][] = $some_variable; 

And finally pass the array

unknown_number_arguments($argument_set);

If you are commonly just passing in the 8th value, you can reorder your parameters so it is first. You only need to specify parameters up until the last one you want to set.

If you are using different values, you have 2 options.

One would be to create a set of wrapper functions that take different parameters and set the defaults on the others. This is useful if you only use a few combinations, but can get very messy quickly.

The other option is to pass an array where the keys are the names of the parameters. You can then just check if there is a value in the array with a key, and if not use the default. But again, this can get messy and add a lot of extra code if you have a lot of parameters.


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

You can make a regular function and then add your optional variables by giving them a default Null value.

A Null is still a value, if you don't call the function with a value for that variable, it won't be empty so no error.


func( "1", "2", default, default, default, default, default, "eight" );

참고URL : https://stackoverflow.com/questions/3978929/php-function-with-optional-parameters

반응형