함수 인수

정보는 쉼표로 구분된 표현식 목록인 인수 목록을 통해 함수에 전달할 수 있습니다. 인수는 함수가 실제로 호출되기 전에 왼쪽에서 오른쪽으로 평가됩니다(열심 평가).

PHP는 값(기본값)에 의한 인수 전달, 참조에 의한 전달기본 인수 값을 지원합니다. 가변 길이 인수 목록명명된 인수도 지원됩니다.

예제 #1 함수에 배열 전달

                  
<?php
function takes_array($input)
{
    echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>
                  
                

PHP 8.0.0부터 함수 인수 목록에 후행 쉼표가 포함될 수 있으며 이는 무시됩니다. 이는 인수 목록이 길거나 긴 변수 이름을 포함하는 경우에 특히 유용하므로 인수를 세로로 나열하는 것이 편리합니다.

예제 #2 후행 쉼표가 있는 함수 인수 목록

                  
<?php
function takes_many_args(
    $first_arg,
    $second_arg,
    $a_very_long_argument_name,
    $arg_with_default = 5,
    $again = 'a default string', // This trailing comma was not permitted before 8.0.0.
)
{
    // ...
}
?>
                  
                

PHP 8.0.0부터 선택적 인수 뒤에 필수 인수를 전달하는 것은 더 이상 사용되지 않습니다. 이것은 일반적으로 기본값을 삭제하여 해결할 수 있습니다. 이 규칙의 한 가지 예외는 Type $param = null 형식의 인수입니다. 여기서 null 기본값은 형식을 암시적으로 null 허용으로 만듭니다. 명시적 nullable 형식을 대신 사용하는 것이 좋지만 이 사용은 계속 허용됩니다.

예제 #3 필수 인수 뒤에 선택적 인수 전달

                  
<?php
function foo($a = [], $b) {} // Before
function foo($a, $b) {}      // After

function bar(A $a = null, $b) {} // Still allowed
function bar(?A $a, $b) {}       // Recommended
?>
                  
                
참조로 인수 전달

기본적으로 함수 인수는 값으로 전달됩니다(함수 내의 인수 값이 변경되더라도 함수 외부에서는 변경되지 않음). 함수가 인수를 수정할 수 있도록 하려면 참조로 전달되어야 합니다.

함수에 대한 인수가 항상 참조로 전달되도록 하려면 함수 정의에서 인수 이름 앞에 앰퍼샌드(&)를 추가합니다.

예제 #4 참조로 함수 매개변수 전달

                  
<?php
function add_some_extra(&$string)
{
    $string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // outputs 'This is a string, and something extra.'
?>
                  
                

참조로 전달되어야 하는 값을 인수로 전달하는 것은 오류입니다.

기본 인수 값

함수는 다음과 같이 스칼라 인수에 대한 C++ 스타일 기본값을 정의할 수 있습니다.

예제 #5 함수에서 기본 매개변수 사용

                  
<?php
function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
?>
                  
                

위의 예는 다음을 출력합니다.

Making a cup of cappuccino.
Making a cup of .
Making a cup of espresso.
                

PHP는 또한 배열과 특수 유형 null을 기본값으로 사용할 수 있습니다. 예를 들면 다음과 같습니다.

예제 #6 비 스칼라 유형을 기본값으로 사용

                  
<?php
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
{
    $device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
    return "Making a cup of ".join(", ", $types)." with $device.\n";
}
echo makecoffee();
echo makecoffee(array("cappuccino", "lavazza"), "teapot");
?>
                  
                

기본값은 변수, 클래스 멤버 또는 함수 호출이 아닌 상수 표현식이어야 합니다.

기본 인수를 사용할 때 기본값은 기본이 아닌 인수의 오른쪽에 있어야 합니다. 그렇지 않으면 예상대로 작동하지 않습니다. 다음 코드 스니펫을 고려하십시오.

예제 #7 기본 함수 인수의 잘못된 사용

                  
<?php
function makeyogurt($type = "acidophilus", $flavour)
{
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt("raspberry");   // won't work as expected
?>
                  
                

위의 예는 다음을 출력합니다.

Warning: Missing argument 2 in call to makeyogurt() in
/usr/local/etc/httpd/htdocs/phptest/functest.html on line 41
Making a bowl of raspberry .
                

이제 위의 내용을 다음과 비교하십시오.

예제 #8 기본 함수 인수의 올바른 사용법

                  
<?php
function makeyogurt($flavour, $type = "acidophilus")
{
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt("raspberry");   // works as expected
?>
                  
                

위의 예는 다음을 출력합니다.

Making a bowl of acidophilus raspberry.
                

참고: 참조로 전달되는 인수에는 기본값이 있을 수 있습니다.

가변 길이 인수 목록

PHP는 ... 토큰을 사용하여 사용자 정의 함수의 가변 길이 인수 목록을 지원합니다.

참고: func_num_args(), func_get_arg()func_get_args() 함수를 사용하여 가변 길이 인수를 얻을 수도 있습니다. 이 기술은 ... 토큰이 도입되기 전에 사용되었기 때문에 권장되지 않습니다.

인수 목록에는 함수가 다양한 수의 인수를 허용함을 나타내는 ... 토큰이 포함될 수 있습니다. 인수는 주어진 변수에 배열로 전달됩니다. 예를 들어:

예제 #9 ...를 사용하여 변수 인수에 액세스

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

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

위의 예는 다음을 출력합니다.

10
                

... 함수를 호출하여 배열이나 Traversable 변수 또는 리터럴을 인수 목록으로 압축 해제할 때도 사용할 수 있습니다.

예제 #10 ...를 사용하여 인수 제공

                  
<?php
function add($a, $b) {
    return $a + $b;
}

echo add(...[1, 2])."\n";

$a = [1, 2];
echo add(...$a);
?>
                  
                

위의 예는 다음을 출력합니다.

3
3
                

... 토큰 앞에 일반 위치 인수를 지정할 수 있습니다. 이 경우 위치 인수와 일치하지 않는 후행 인수만 ...에 의해 생성된 배열에 추가됩니다.

... 토큰 앞에 유형 선언을 추가하는 것도 가능합니다. 이것이 있는 경우 ...에 의해 캡처된 모든 인수는 해당 매개변수 유형과 일치해야 합니다.

예제 #11 유형 선언 변수 인수

                  
<?php
function total_intervals($unit, DateInterval ...$intervals) {
    $time = 0;
    foreach ($intervals as $interval) {
        $time += $interval->$unit;
    }
    return $time;
}

$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' days';

// This will fail, since null isn't a DateInterval object.
echo total_intervals('d', null);
?>
                  
                

위의 예는 다음을 출력합니다.

3 days
Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2
                

마지막으로 변수 인수는 ... 앞에 앰퍼샌드(&)를 붙여 참조로 전달할 수도 있습니다.

이전 버전의 PHP

함수가 가변적이라는 사실에 특별한 구문이 필요하지 않습니다. 그러나 함수의 인수에 대한 액세스는 func_num_args(), func_get_arg()func_get_args()를 사용해야 합니다.

위의 첫 번째 예제는 이전 버전의 PHP에서 다음과 같이 구현됩니다.

예제 #12 이전 PHP 버전에서 변수 인수 액세스

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

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

위의 예는 다음을 출력합니다.

10
                
명명된 인수

PHP 8.0.0은 기존 위치 매개변수의 확장으로 명명된 인수를 도입했습니다. 명명된 인수를 사용하면 매개변수 위치가 아닌 매개변수 이름을 기반으로 함수에 인수를 전달할 수 있습니다. 이것은 인수의 의미를 자체 문서화하고 인수를 순서 독립적으로 만들고 임의로 기본값을 건너뛸 수 있도록 합니다.

명명된 인수는 값의 접두사에 매개변수 이름과 콜론이 오는 방식으로 전달됩니다. 예약어를 매개변수 이름으로 사용할 수 있습니다. 매개변수 이름은 식별자여야 하며 동적으로 지정할 수 없습니다.

예제 #13 명명된 인수 구문

                  
<?php
myFunction(paramName: $value);
array_foobar(array: $value);

// NOT supported.
function_name($variableStoringParamName: $value);
?>
                  
                

예제 #14 위치 인수 대 명명된 인수

                  
<?php
// Using positional arguments:
array_fill(0, 100, 50);

// Using named arguments:
array_fill(start_index: 0, count: 100, value: 50);
?>
                  
                

명명된 인수가 전달되는 순서는 중요하지 않습니다.

예제 #15 매개변수 순서가 다른 위와 동일한 예

                  
<?php
array_fill(value: 50, count: 100, start_index: 0);
?>
                  
                

명명된 인수는 위치 인수와 결합될 수 있습니다. 이 경우 명명된 인수는 위치 인수 뒤에 와야 합니다. 순서에 관계없이 함수의 선택적 인수 중 일부만 지정할 수도 있습니다.

예제 #16 명명된 인수와 위치 인수 결합

                  
<?php
htmlspecialchars($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8', false);
?>
                  
                

동일한 매개변수를 여러 번 전달하면 오류 예외가 발생합니다.

예제 #17 동일한 매개변수를 여러 번 전달할 때 오류 예외

                  
<?php
function foo($param) { ... }

foo(param: 1, param: 2);
// Error: Named parameter $param overwrites previous argument
foo(1, param: 2);
// Error: Named parameter $param overwrites previous argument
?>