programing

선택적 매개 변수를 사용하는 PHP 함수

randomtip 2022. 9. 14. 22:07
반응형

선택적 매개 변수를 사용하는 PHP 함수

10개의 파라미터를 수용할 수 있는 PHP 함수를 작성했지만 2개만 필요합니다.8번째 파라미터를 정의하고 싶을 때도 있지만 8번째 파라미터가 될 때까지 각 파라미터에 빈 문자열을 입력하고 싶지 않습니다.

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

원하는 파라미터만 전달할 수 있도록 기능을 설정하는 더 좋은 방법이 있나요?

이 경우 키는 파라미터 이름이고 값은 값인 배열을 전달합니다.

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

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

함수에 배열이라는 하나의 매개 변수를 가져오도록 합니다.실제 매개 변수를 배열의 값으로 전달합니다.


편집: Pekka의 코멘트에 있는 링크는 그것을 요약합니다.

원하는 것을 달성하려면 Rabbot이 말한 것처럼 어레이를 사용합니다(다만 과도하게 사용하면 문서화/유지관리가 번거로울 수 있습니다).또는 기존의 옵션인 arg를 사용합니다.

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

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

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

PHP 5.6 이후에서는 인수 목록은 함수가 변수 개수의 인수를 받아들이는 것을 나타내는 ... 토큰을 포함할 수 있습니다.인수는 지정된 변수에 배열로 전달됩니다.다음은 예를 제시하겠습니다.

예: 변수 인수에 액세스하기 위해 ...을 사용하는 경우

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

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

위의 예는 다음과 같습니다.

10

Variable-length 인수 목록 PHP 설명서

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

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

  • func_num_params() 및 func_get_param() 함수를 사용합니다.
  • 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";
}

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

「 」부터 합니다.PHP 8이름 있는 인수를 사용할 수 있습니다.

function namedParameters($paramOne, $paramTwo, $paramThree = 'test', $paramFour = null)
{
    dd($paramOne, $paramTwo, $paramThree, $paramFour);
}

함수는 이 함수로 할 수 .requiredParams와 Optinal Params만 다를 수 있습니다.default함수에 지정한 값입니다.

namedParameters('one', 'two', paramFour: 'four');

결과:

// "one", "two", "test", "four"

물건을 파라암으로 운반할 수도 있을 것 같아요.

$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:정의되지 않은 속성: 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개뿐인 경우, 다른 모든 옵션 인수를 삭제하고 (실행 시에 변경하지 않는 한) 그 인수에 세터를 지정할 수 있습니다.그런 다음 두 개의 필수 인수를 사용하여 개체를 인스턴스화하고 나머지 인수는 설정기를 통해 필요에 따라 설정합니다.

추가 정보

오래된 게시물인 건 알지만 작전과 같은 문제가 있어서 이렇게 생각해 낸 거예요.

통과할 수 있는 배열의 예.특정 주문이 필요한 경우 재주문할 수 있지만, 이 질문의 경우 요청하신 대로 처리됩니다.

$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);
function yourFunction($var1, $var2, $optional = Null){
   ... code
}

일반 함수를 만든 다음 기본 Null 값을 지정하여 옵션 변수를 추가할 수 있습니다.

Null은 여전히 값이며, 해당 변수의 값을 사용하여 함수를 호출하지 않으면 비어 있지 않으므로 오류가 발생하지 않습니다.

일반적으로 8번째 값만 전달하면 매개 변수를 먼저 정렬할 수 있습니다.마지막으로 설정할 파라미터까지만 지정하면 됩니다.

다른 값을 사용하는 경우 두 가지 옵션이 있습니다.

하나는 다른 파라미터를 사용하는 래퍼 함수 세트를 만들고 다른 파라미터에 기본값을 설정하는 것입니다.이것은 몇 가지 조합만 사용하는 경우 유용하지만, 금방 지저분해질 수 있습니다.

다른 옵션은 키를 매개 변수의 이름으로 하는 배열을 전달하는 것입니다.그런 다음 키를 사용하여 배열에 값이 있는지, 기본값을 사용하지 않는지 확인할 수 있습니다.그러나 파라미터가 많으면 이 작업이 복잡해지고 코드가 많이 추가됩니다.

PHP는 기본 인수(링크)를 허용합니다.이 경우 함수 코드에 따라 3~8의 모든 파라미터를 NULL 또는 빈 문자열로 정의할 수 있습니다.이 방법에서는 처음 두 개의 파라미터를 사용하여 함수를 호출할 수 있습니다.

예를 들어 다음과 같습니다.

<?php
  function yourFunction($arg1, $arg2, $arg3=NULL, $arg4=NULL, $arg5=NULL, $arg6=NULL, $arg7=NULL, $arg8=NULL){
echo $arg1;
echo $arg2;
if(isset($arg3)){echo $arg3;}
# other similar statements for $arg4, ...., $arg5
if(isset($arg8)){echo $arg8;}
}

사용하지 않을 파라미터를 무시하려면 Null을 설정한 다음 위치에 따라 필요한 파라미터를 설정합니다.

 function myFunc($p1,$p2,$p3=Null,$p4=Null,$p5=Null,$p6=Null,$p7=Null,$p8=Null){
    for ($i=1; $i<9; $i++){
        $varName = "p$i";
        if (isset($$varName)){
            echo $varName." = ".$$varName."<br>\n";
        }
    }
}   

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

언급URL : https://stackoverflow.com/questions/3978929/php-function-with-optional-parameters

반응형