복붙노트

함수에서 기본 인수 사용

PHP

함수에서 기본 인수 사용

PHP 함수의 기본값에 대해 혼란 스럽습니다. 다음과 같은 함수가 있다고 가정 해보십시오.

function foo($blah, $x = "some value", $y = "some other value") {
    // code here!
}

$ x에 기본 인수를 사용하고 $ y에 다른 인수를 설정하려면 어떻게해야합니까?

나는 여러 가지 방법으로 실험 해 왔으며 점점 혼란스러워지고 있습니다. 예를 들어, 나는이 두 가지를 시도했다.

foo("blah", null, "test");
foo("blah", "", "test");

그러나 이들 모두는 $ x에 대해 적절한 기본 인수를 초래하지 않습니다. 또한 변수 이름으로 설정하려고했습니다.

foo("blah", $x, $y = "test");   

나는이 일을 기대했다. 그러나 그것은 내가 예상했던대로 작동하지 않습니다. 내가하는 일과 상관없이, 함수를 호출 할 때마다 기본 인수를 입력해야합니다. 그리고 나는 명백한 것을 놓치고있을 것입니다.

해결법

  1. ==============================

    1.함수 선언을 다음과 같이 변경하여 원하는 것을 할 수 있도록 제안합니다.

    함수 선언을 다음과 같이 변경하여 원하는 것을 할 수 있도록 제안합니다.

    function foo($blah, $x = null, $y = null) {
        if (null === $x) {
            $x = "some value";
        }
    
        if (null === $y) {
            $y = "some other value";
        }
    
        code here!
    
    }
    

    이렇게하면 foo ( 'blah', null, 'default가 아닌 y 값')와 같은 호출을 할 수 있습니다. 두 번째 매개 변수 $ x가 여전히 기본값을 얻는 원하는대로 작동하게하십시오.

    이 메서드를 사용하면 null 값을 전달하면 그 뒤에 오는 매개 변수의 기본값을 재정의하려는 경우 한 매개 변수의 기본값을 원한다는 의미입니다.

    다른 답변에서 언급했듯이,

    다양한 수의 매개 변수와 다양한 유형의 매개 변수를 허용 할 수있는 메서드가있는 경우 Ryan P.에 표시된 답변과 비슷한 함수를 선언합니다.

    다음은 또 다른 예입니다 (이 질문에 대한 답변은 아니지만 유익한 정보 일 것입니다.

    public function __construct($params = null)
    {
        if ($params instanceof SOMETHING) {
            // single parameter, of object type SOMETHING
        } else if (is_string($params)) {
            // single argument given as string
        } else if (is_array($params)) {
            // params could be an array of properties like array('x' => 'x1', 'y' => 'y1')
        } else if (func_num_args() == 3) {
            $args = func_get_args();
    
            // 3 parameters passed
        } else if (func_num_args() == 5) {
            $args = func_get_args();
            // 5 parameters passed
        } else {
            throw new InvalidArgumentException("Could not figure out parameters!");
        }
    }
    
  2. ==============================

    2.선택적 인수는 함수 호출이 끝날 때만 작동합니다. $ x를 지정하지 않고도 함수에서 $ y의 값을 지정할 방법이 없습니다. 일부 언어는 명명 된 매개 변수 (예 : VB / C #)를 통해이를 지원하지만 PHP는 지원하지 않습니다.

    선택적 인수는 함수 호출이 끝날 때만 작동합니다. $ x를 지정하지 않고도 함수에서 $ y의 값을 지정할 방법이 없습니다. 일부 언어는 명명 된 매개 변수 (예 : VB / C #)를 통해이를 지원하지만 PHP는 지원하지 않습니다.

    인수 대신 매개 변수에 대한 연관 배열을 사용하는 경우이를 에뮬레이트 할 수 있습니다.

    function foo(array $args = array()) {
        $x = !isset($args['x']) ? 'default x value' : $args['x'];
        $y = !isset($args['y']) ? 'default y value' : $args['y'];
    
        ...
    }
    

    그런 다음 함수를 다음과 같이 호출하십시오.

    foo(array('y' => 'my value'));
    
  3. ==============================

    3.실제로 가능합니다.

    실제로 가능합니다.

    foo( 'blah', (new ReflectionFunction('foo'))->getParameters()[1]->getDefaultValue(), 'test');
    

    당신이 그렇게하고 싶지는 또 다른 이야기입니다 :)

    이 솔루션을 피하는 이유는 다음과 같습니다.

    그러나 실제로 다음과 같은 상황에서 유용 할 수 있습니다.

    성능에 관해서는 Reflection API를 사용하여 기본 매개 변수를 사용하면 함수 호출이 25 배 느려지 며 1 마이크로 초도 걸리지 않는다는 간단한 테스트가 있습니다. 당신이 그걸로 살 수 있는지 알아야합니다.

    물론 루프에서 사용하려는 경우 사전에 기본값을 가져야합니다.

  4. ==============================

    4.

    function image(array $img)
    {
        $defaults = array(
            'src'    => 'cow.png',
            'alt'    => 'milk factory',
            'height' => 100,
            'width'  => 50
        );
    
        $img = array_merge($defaults, $img);
        /* ... */
    }
    
  5. ==============================

    5.내가 그것을하는 것을 알고있는 유일한 방법은 매개 변수를 생략하는 것입니다. 매개 변수를 생략하는 유일한 방법은 생략해야하는 매개 변수가 설정해야하는 매개 변수 뒤에 오도록 매개 변수 목록을 다시 정렬하는 것입니다. 예 :

    내가 그것을하는 것을 알고있는 유일한 방법은 매개 변수를 생략하는 것입니다. 매개 변수를 생략하는 유일한 방법은 생략해야하는 매개 변수가 설정해야하는 매개 변수 뒤에 오도록 매개 변수 목록을 다시 정렬하는 것입니다. 예 :

    function foo($blah, $y = "some other value", $x = "some value")
    

    그런 다음 foo를 다음과 같이 호출 할 수 있습니다.

    foo("blah", "test");
    

    결과는 다음과 같습니다.

    $blah = "blah";
    $y = "test";
    $x = "some value";
    
  6. ==============================

    6.이 작업은 직접 수행 할 수 없지만 약간의 코드 조작만으로도 에뮬레이트가 가능합니다.

    이 작업은 직접 수행 할 수 없지만 약간의 코드 조작만으로도 에뮬레이트가 가능합니다.

    function foo($blah, $x = false, $y = false) {
      if (!$x) $x = "some value";
      if (!$y) $y = "some other value";
    
      // code
    }
    
  7. ==============================

    7.나는 최근에이 문제가 있었고이 질문과 답변을 발견했습니다. 위의 질문이 작동하는 동안 문제는 PHPStorm과 같은 IDE를 지원하는 IDE에 기본값을 표시하지 않는다는 것입니다.

    나는 최근에이 문제가 있었고이 질문과 답변을 발견했습니다. 위의 질문이 작동하는 동안 문제는 PHPStorm과 같은 IDE를 지원하는 IDE에 기본값을 표시하지 않는다는 것입니다.

    null을 사용하면 값을 공백으로두면 값이 무엇인지 알 수 없습니다.

    필자가 선호하는 솔루션은 함수 정의에 기본값을 넣는 것입니다.

    protected function baseItemQuery(BoolQuery $boolQuery, $limit=1000, $sort = [], $offset = 0, $remove_dead=true)
    {
        if ($limit===null) $limit =1000;
        if ($sort===null) $sort = [];
        if ($offset===null) $offset = 0;
        ...
    

    유일한 차이점은 내가 똑같은지 확인해야한다는 것입니다.하지만 추가 선명도를 지불하는 데는 작은 댓가라고 생각합니다.

  8. ==============================

    8.이것은 객체가 더 좋은 경우입니다. 객체를 설정하여 x 및 y를 유지하고 기본값 등을 설정할 수 있기 때문입니다.

    이것은 객체가 더 좋은 경우입니다. 객체를 설정하여 x 및 y를 유지하고 기본값 등을 설정할 수 있기 때문입니다.

    배열을 이용한 접근은 객체를 생성 할 수 있습니다 (사실, 객체는 객체의 매개 변수와 함수의 묶음이며 배열을 취하는 함수는 일부 묶음 매개 변수를 통해 작동합니다)

    틀림없이 당신은 언제나 null을 설정할 수있는 트릭이나 기본값으로 이것을 할 수 있습니다.

  9. ==============================

    9.빈 문자열이 인수로 있는지 확인할 수도 있습니다. 다음과 같이 호출 할 수 있습니다.

    빈 문자열이 인수로 있는지 확인할 수도 있습니다. 다음과 같이 호출 할 수 있습니다.

    foo ( 'blah', "", '기본값이 아닌 y 값', null);

    함수 밑에 :

    function foo($blah, $x = null, $y = null, $z = null) {
        if (null === $x || "" === $x) {
            $x = "some value";
        }
    
        if (null === $y || "" === $y) {
            $y = "some other value";
        }
    
        if (null === $z || "" === $z) {
            $z = "some other value";
        }
    
        code here!
    
    }
    

    null 또는 ""를 채우더라도 같은 결과를 얻을 수 있습니다.

  10. from https://stackoverflow.com/questions/9166914/using-default-arguments-in-a-function by cc-by-sa and MIT license