PHP 함수는 function 키워드, 이름, 매개변수 목록, 본문으로 정의하며, return이 호출한 쪽에 값을 돌려보냅니다. function add(int $a, int $b): int { return $a + $b; }로 정의하고, add(2, 3)으로 호출하면 5를 반환합니다.
매개변수 앞의 string과 int는 타입 선언이고, 괄호 뒤의 : string은 반환 타입입니다. 둘 다 선택 사항이지만 실수를 일찍 잡아내고 함수가 무엇을 기대하는지 문서화해 줍니다.
반환값과 여러 값 반환하기
return은 함수를 즉시 끝냅니다. return이 없거나 그냥 return;만 있는 함수는 null을 반환합니다. 효과만을 위해 호출하는 함수라면 : void를 선언하세요. 함수는 값을 하나 반환하지만, 그 값이 배열일 수 있으며 호출하는 쪽에서 구조 분해합니다.
[...] =의 다른 형태는 배열 구조 분해를 참고하세요.
기본 매개변수와 이름 있는 인수
= value가 붙은 매개변수는 선택 사항이라 호출할 때 생략할 수 있습니다. 선택적 매개변수는 필수 매개변수 뒤에 옵니다. PHP 8.0부터는 이름 있는 인수로 어떤 매개변수든 이름으로 넘길 수 있어서 필요 없는 선택적 매개변수를 건너뛸 수 있습니다.
이름 있는 인수는 내장 함수 호출도 읽기 쉽게 만듭니다: str_pad('7', 3, '0', pad_type: STR_PAD_LEFT). 매개변수 이름이 함수의 공개 인터페이스 일부가 되므로, 매개변수 이름을 바꾸면 이름을 쓰는 호출이 깨질 수 있습니다.
참조 전달
보통 PHP는 각 인수의 복사본을 넘기므로 함수가 호출한 쪽의 변수를 바꿀 수 없습니다. 매개변수 앞의 &는 변수 자체를 넘깁니다. sort() 같은 내장 함수가 이 방식으로 동작합니다.
인수를 바꾸는 것보다 새 값을 반환하는 편이 보통 더 명확합니다. 함수가 정말로 무언가를 그 자리에서 수정하기 위한 것일 때 참조를 쓰세요.
타입 선언과 strict_types
기본적으로 PHP는 가능하면 인수를 선언된 타입으로 변환합니다. add("5", 3)은 "5"를 5로 바꿉니다. 파일 맨 위에 declare(strict_types=1);을 두면 그 파일에서 하는 호출에 대해 이 변환을 끄므로, 잘못된 타입은 변환되는 대신 TypeError를 던집니다.
declare 줄이 없으면 같은 호출이 8을 출력합니다. "five"처럼 숫자가 아닌 문자열은 두 모드 모두에서 TypeError를 던집니다.
매개변수와 반환값에 선언할 수 있는 타입입니다.
never는 항상 예외를 던지거나 종료하는 함수의 반환 타입입니다. 클래스와 인터페이스 이름도 타입으로 쓸 수 있습니다.
...$args로 가변 개수 인수 받기
...$numbers는 개수에 상관없이 인수를 배열로 모읍니다. 호출하는 쪽의 같은 ...은 배열을 개별 인수로 펼칩니다.
함수 안에서 바깥 변수 쓰기
함수에는 자체 스코프가 있습니다. 바깥에서 정의한 변수는 안에서 보이지 않으며, JavaScript에서 온 사람들은 이 점에 놀랍니다.
<?php
$taxRate = 0.2;
function priceWithTax(float $price): float
{
return $price * (1 + $taxRate); // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6
그리고 함수는 세금이 빠진 가격을 반환합니다. 대신 값을 매개변수로 넘기세요. 그러면 함수가 무엇에 의존하는지 분명해지고 테스트하기 쉬워집니다.
global 키워드도 동작하지만 의존성을 숨깁니다. 변수 스코프에서 다룹니다. array_map()의 콜백처럼 다른 함수에 넘기는 짧은 함수는 use로 바깥 변수를 가져올 수 있는 익명 함수를 참고하세요.
자주 묻는 질문
PHP에서 함수를 정의하려면 어떻게 하나요?
function 키워드, 이름, 괄호 안의 매개변수, 본문을 쓰세요: function add(int $a, int $b): int { return $a + $b; }. add(2, 3)으로 호출합니다. 함수 이름은 대소문자를 구분하지 않으며, 파일 최상위에 정의한 함수는 정의한 줄보다 앞에서도 호출할 수 있습니다.
PHP 함수에서 여러 값을 반환하려면 어떻게 하나요?
배열을 반환하고 구조 분해하세요: function minMax(array $a): array { return [min($a), max($a)]; } 그다음 [$min, $max] = minMax([3, 1, 4]);. 이름 있는 결과가 필요하면 연관 배열을 반환하고 ['min' => $min] = ...을 쓰세요.
declare(strict_types=1)은 무엇을 하나요?
그 파일에서 이루어지는 호출의 자동 타입 변환을 끕니다. 그래서 int 매개변수에 "5"를 넘기면 5로 변환되는 대신 TypeError가 납니다. 파일의 맨 첫 문장이어야 하며 그 파일에만 영향을 줍니다.
PHP의 이름 있는 인수는 무엇인가요?
PHP 8.0부터 매개변수 이름으로 인수를 넘길 수 있습니다: htmlspecialchars($s, double_encode: false). 위치 인수 뒤에서는 어떤 순서로든 줄 수 있고, 바꾸지 않을 선택적 매개변수를 건너뛸 수 있습니다.
PHP에서 변수를 참조로 전달하려면 어떻게 하나요?
매개변수 앞에 &를 붙이세요: function addOne(int &$n): void { $n++; }. 그러면 함수가 호출한 쪽의 변수를 바꿉니다. &가 없으면 PHP는 복사본을 넘기고 호출한 쪽의 변수는 그대로입니다.