소개
PHP는 수학, 문자열, 날짜, 배열 처리 등을 위한 수많은 내장 함수를 제공합니다. 동시에 개발자가 특정 요구 사항에 맞춰 직접 함수를 정의할 수도 있는데, 이렇게 직접 만든 함수를 사용자 정의 함수(user defined function)라고 합니다.
함수란 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. function 키워드로 정의하며, 함수 이름은 알파벳이나 밑줄(_)로 시작해야 합니다. 한 번 정의한 함수는 프로그램 내 어디에서든 몇 번이든 호출할 수 있습니다.
기본 문법
// 함수 정의
function myfunction($arg1, $arg2, ... $argn)
{
statement1;
statement2;
..
..
return $val;
}
// 함수 호출
$ret=myfunction($arg1, $arg2, ... $argn);함수는 선택적으로 원하는 개수만큼의 인자를 받을 수 있습니다. 단, 호출할 때는 정의된 인자 개수와 동일한 개수의 인자를 전달해야 합니다. 함수 본문에는 조건문, 반복문 등 유효한 PHP 코드라면 무엇이든 포함될 수 있으며, 심지어 다른 함수나 클래스를 함수 내부에 정의하는 것도 가능합니다. 블록의 모든 문장이 실행되면 return 문이 마지막에 있든 없든 프로그램 제어는 자동으로 함수가 호출된 위치로 돌아갑니다. return 문 앞에 표현식이 있다면 그 값이 호출 환경으로 반환됩니다.
사용자 정의 함수 예제
다음 예제는 sayhello()라는 사용자 정의 함수를 정의하고 호출하는 기본적인 방법을 보여줍니다.
예제
<?php
// 함수 정의
function sayHello(){
echo "Hello World!";
}
// 함수 호출
sayHello();
?>이 스크립트를 명령줄에서 실행하면 다음과 같은 결과가 출력됩니다.
출력 결과
Hello World!
인자가 있는 함수
다음 예제에서는 두 개의 형식 인자(formal argument)를 갖는 함수를 정의합니다.
예제
<?php
function add($arg1, $arg2){
echo $arg1+$arg2 . "\n";
}
add(10,20);
add("Hello", "World");
?>출력 결과
실행하면 다음과 같은 결과가 나옵니다.
30 PHP Warning: A non-numeric value encountered in line 3
두 번째 호출에서는 문자열 두 개가 인자로 전달되었습니다. PHP는 문자열에 대해 + 연산자를 지원하지 않으므로 경고(warning)가 발생합니다.
반환값이 있는 함수
다음 예제의 사용자 정의 함수는 전달받은 인자를 처리한 후 그 결과값을 호출 환경으로 반환합니다.
예제
<?php
function add($arg1, $arg2){
return $arg1+$arg2;
}
$val=add(10,20);
echo "addition:". $val. "\n";
$val=add("10","20");
echo "addition: $val";
?>출력 결과
실행하면 다음과 같은 결과가 나옵니다.
addition:30 addition:30
두 번째 호출에서는 인자가 문자열이지만, PHP가 이를 자동으로 정수로 변환하여 덧셈을 수행합니다.
기본 인자값이 있는 함수
함수를 정의할 때 인자에 기본값(default value)을 지정할 수 있습니다. 함수 호출 시 해당 인자에 값을 전달하지 않으면 함수 내부 처리에 기본값이 사용됩니다. 다음 예제는 기본값을 가진 인자로 함수를 정의하는 방법을 보여줍니다.
예제
<?php
function welcome($user="Guest"){
echo "Hello $user\n";
}
// 기본값 재정의
welcome("admin");
// 기본값 사용
welcome();
?>출력 결과
실행하면 다음과 같은 결과가 나옵니다.
Hello admin Hello Guest
두 번째 호출에서는 아무 값도 전달하지 않고 함수를 호출했습니다. 이 경우 user 인자는 기본값인 "Guest"를 사용합니다.
가변 길이 인자를 받는 함수
임의 개수의 인자를 받을 수 있도록 함수를 정의하는 것도 가능합니다. 함수 정의에서 형식 인자 이름 앞에 ...(스프레드 연산자) 토큰을 붙이면 됩니다. 다음 예제의 add() 함수는 인자로 전달된 숫자 목록을 모두 더합니다.
예제
<?php
function add(...$numbers){
$ttl=0;
foreach ($numbers as $num){
$ttl=$ttl+$num;
}
return $ttl;
}
$total=add(10,15,20);
echo "total= $total\n";
echo "total=". add(1,2,3,4,5). "\n";
?>출력 결과
실행하면 다음과 같은 결과가 나옵니다.
total= 45 total=15
func_get_args() 함수를 사용하면 함수에 전달된 인자 목록을 배열 형태로 얻을 수도 있습니다. PHP 반복문으로 전달된 인자 목록의 각 값을 순회할 수 있으며, 이 경우 함수 정의에 형식 인자를 선언하지 않습니다.
예제
<?php
function add(){
$numbers=func_get_args();
$ttl=0;
foreach ($numbers as $num){
$ttl=$ttl+$num;
}
return $ttl;
}
$total=add(10,15,20);
echo "total= $total\n";
echo "total=". add(1,2,3,4,5). "\n";
?>출력 결과
실행하면 다음과 같은 결과가 나옵니다.
total= 45 total=15
함수 안에 정의된 함수
함수는 다른 함수의 본문 블록 안에서 정의할 수도 있습니다. 다만 내부 함수는 외부 함수가 먼저 호출된 이후에만 호출할 수 있습니다.
예제
<?php
function hello(){
echo "Hello\n";
function welcome(){
echo "Welcome to TutorialsPoint\n";
}
}
//welcome();
hello();
welcome();
?>주석을 해제하여 hello()보다 먼저 welcome()을 호출하면 다음 오류 메시지와 함께 프로그램이 중단됩니다.
Fatal error: Uncaught Error: Call to undefined function welcome()
출력 결과
해당 줄을 다시 주석 처리하고 실행하면 다음과 같은 결과가 출력됩니다.
Hello Welcome to TutorialsPoint
재귀 함수
자기 자신을 호출하는 함수를 재귀 함수(recursive function)라고 합니다. 종료 조건 없이 무조건 자신을 호출하면 무한 루프에 빠지고, 스택이 가득 차 메모리 부족(out of memory) 오류가 발생합니다. 다음 프로그램은 factorial() 함수를 재귀적으로 호출합니다.
예제
<?php
function factorial($n){
if ($n < 2) {
return 1;
} else {
return ($n * factorial($n-1));
}
}
echo "factorial(5) = ". factorial(5);
?>출력 결과
factorial(5) = 120