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