programing

함수에서의 디폴트 인수 사용

copyandpastes 2022. 10. 1. 21:38
반응형

함수에서의 디폴트 인수 사용

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");   

이런 게 먹힐 줄 알았어.그런데 전혀 생각대로 되지 않아요.어떤 작업을 해도 함수를 호출할 때마다 기본 인수를 입력해야 할 것 같습니다.내가 뭔가 놓치고 있는 게 틀림없어

함수 선언을 다음과 같이 변경할 것을 제안합니다.

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, 'non-default y value'); 매개 변수인 '마음대로 '에서 '마음대로 '가 .$x는 여전히 기본값을 가져옵니다.

이 방법에서는 null 값을 전달하면 파라미터 뒤에 오는 파라미터의 기본값을 덮어쓸 때 파라미터의 기본값을 사용할 수 있습니다.

다른 답변에도 있듯이

default 파라미터는 함수의 마지막 인수로만 기능합니다.함수 정의에서 기본값을 선언하는 경우 한 개의 매개 변수를 생략하고 다음 매개 변수를 재정의할 수 없습니다.

파라미터의 수나 타입이 다른 파라미터에 대응할 수 있는 방법이 있으면 Ryan P의 답변과 같은 함수를 선언하는 경우가 많습니다.

다음은 또 다른 예입니다(질문에 대한 답변은 아니지만 참고가 되었으면 합니다).

public function __construct($params = null)
{
    if ($params instanceof SOMETHING) {
        // single parameter, of object type SOMETHING
    } elseif (is_string($params)) {
        // single argument given as string
    } elseif (is_array($params)) {
        // params could be an array of properties like array('x' => 'x1', 'y' => 'y1')
    } elseif (func_num_args() == 3) {
        $args = func_get_args();

        // 3 parameters passed
    } elseif (func_num_args() == 5) {
        $args = func_get_args();
        // 5 parameters passed
    } else {
        throw new \InvalidArgumentException("Could not figure out parameters!");
    }
}

옵션의 인수는 함수 호출의 마지막에만 기능합니다.함수에서 $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'));

실제로 다음과 같은 일이 가능합니다.

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

그렇게 하고 싶은지 아닌지는 다른 이야기입니다.


갱신:

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

  • 보기 흉하다
  • 오버헤드가 뚜렷합니다.
  • 다른 답이 증명하듯이, 다른 대안이 있다.

그러나 실제로는 다음과 같은 상황에서 유용합니다.

  • 원래 기능을 변경하지 않거나 변경할 수 없습니다.

  • 기능을 변경할 수 있지만:

    • 사용.null(또는 동등한 것)은 옵션이 아닙니다(DiegoDD의 코멘트 참조).
    • 동료나 동료 중 어느 쪽과도 함께 가고 싶지 않다func_num_args()
    • 당신의 목숨은 LOC를 몇 개 구하는 것에 달려있다.

퍼포먼스에 대해서는 매우 간단한 테스트로 Reflection API를 사용하여 기본 파라미터를 취득하면 함수 호출이 25배 느려지는 반면 1마이크로초 미만이 걸린다는 것을 알 수 있습니다.당신은 그걸 감수할 수 있는지 알아야 해요.

물론 루프에서 사용하는 경우에는 사전에 기본값을 설정해야 합니다.

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

    $img = array_merge($defaults, $img);
    /* ... */
}

명명된 인수를 사용하는 PHP 8

인수 $x에 기본값을 사용하고 $y 값을 설정하려면 어떻게 해야 합니까? foo($blah, $x = "some value", $y = "some other value")

사용방법-1:

foo(blah: "blah", y: "test");

용도-2:

// use names to address last arguments
foo("blah", y: "test");

네이티브 기능에서도 이 기능을 사용합니다.

htmlspecialchars($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

기능과 매뉴얼에 대해서

명명된 인수를 사용하면 매개 변수 위치가 아닌 매개 변수 이름을 기준으로 함수에 인수를 전달할 수 있습니다.이를 통해 인수의 의미를 스스로 문서화하고 인수를 순서에 구애받지 않고 임의로 기본값을 건너뛸있습니다.

IDE 지원

Netbeans 12.3은 명명된 인수에 대한 코드 완성을 제외하고 이 기능을 포함한 PHP 8.0 구문을 완전히 지원합니다.

내가 아는 유일한 방법은 매개 변수를 생략하는 것이다.파라미터를 생략하는 유일한 방법은 생략할 파라미터가 설정할 파라미터 에 오도록 파라미터 리스트를 재정렬하는 것입니다.예를 들어 다음과 같습니다.

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

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

foo("blah", "test");

그 결과, 다음과 같은 결과가 됩니다.

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

저는 최근에 이런 문제를 겪었고 이 질문과 답변을 발견했습니다.위의 질문은 유효하지만 PHPStorm 등의 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;
    ...

유일한 차이점은 같은 것을 확실히 해야 한다는 것입니다.그러나 그 이상의 명확성을 위해 지불하기에는 적은 대가라고 생각합니다.

PHP 8에서는 이 문제에 대해 명명된 인수를 사용할 수 있습니다.

따라서 이 질문의 원본 포스터에서 설명한 문제를 해결할 수 있습니다.

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

포함:

foo(blah: "blah", y: "test");

참고 자료: https://wiki.php.net/rfc/named_params (특히 "Skiping defaults" 섹션)

직접 할 수는 없지만 코드를 조금만 만지작거리면 에뮬레이션이 가능합니다.

function foo($blah, $x = false, $y = false) {
  if (!$x) $x = "some value";
  if (!$y) $y = "some other value";

  // code
}

또한 다음과 같이 호출할 수 있도록 인수로서 빈 문자열이 있는지 여부를 확인할 수 있습니다.

foo('blah', "", 'non-default y value', 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 ★★★★★★★★★★★★★★★★★」"" 거예요

2센트와 null couldering 연산자는 ??7 )(PHP 7 후))

function foo($blah, $x = null, $y = null) {
    $varX = $x ?? 'Default value X';
    $varY = $y ?? 'Default value Y';
    // ...
}

자세한 예는 repl.it에서 확인하실 수 있습니다.

이것은 오브젝트가 더 나은 경우입니다.x 와 y 를 유지하도록 오브젝트를 설정할 수 있기 때문에 기본값 등을 설정할 수 있습니다.

어레이를 사용한 접근법은 오브젝트를 작성하기 위해 접근하고 있습니다(실제로 오브젝트는 오브젝트 상에서 동작하는 파라미터와 함수 집합이며, 어레이를 취득하는 함수는 몇 개의 ov 파라미터 상에서 동작합니다).

물론 늘(null) 등을 기본값으로 설정하기 위한 몇 가지 트릭을 언제든지 수행할 수 있습니다.

<?php
function info($name="George",$age=18) {
echo "$name is $age years old.<br>";
}
info();     // prints default values(number of values = 2)
info("Nick");   // changes first default argument from George to Nick
info("Mark",17);    // changes both default arguments' values

?>

개별 매개 변수 대신 배열을 함수에 전달하고 Null 병합 연산자(PHP 7+)를 사용합니다.

아래 2개의 아이템이 포함된 어레이를 전달합니다.함수 내에서 item1의 값이 설정되어 있는지, 기본 볼트가 할당되어 있지 않은지 확인합니다.

$args = ['item2' => 'item2',
        'item3' => 'value3'];

    function function_name ($args) {
        isset($args['item1']) ? $args['item1'] : 'default value';
    }

PHP 8가지 방법:

function foo($blah, ?$x, ?$y) {
    $x = $x ?? "some value";
    $y = $y ?? "some other value";
}

또 다른 방법:

function sum($args){
    $a = $args['a'] ?? 1;
    $b = $args['b'] ?? 1;
    return $a + $b;
}

echo sum(['a' => 2, 'b' => 3]); // 5 
echo sum(['a' => 2]); // 3 (2+1)
echo sum(['b' => 3]); // 4 (1+3)
echo sum([]); // 2 (1+1)

언급URL : https://stackoverflow.com/questions/9166914/using-default-arguments-in-a-function

반응형