함수는 모든 유효한 php코드, 즉 조건문, 클레스, 전역변수, 외부변수, 중첩, 상수 등 외부의 모든 작업을 함수 내에서 사용할 수 있도록 만들어진 코드 블록의 하나로 모듈화가 가능합니다.

모든 기능을 한 곳에서 처리하게 되면 코드를 해석하고, 관리하는 게 관리자의 입장에서 매우 어려워질 수 있습니다. 예를 들어 어떤 글을 주제별로 나누어 놓으면 읽기에 좋고, 찾기에도 쉬워 가독성이 좋아진다는 이점이 있습니다.

이렇게 기능별로 함수를 만들어 놓은 것을 모듈화라고 부르고, 더 세분화할수록 가독성은 더욱 좋아집니다.

함수는 내장함수, 외장함수, 익명함수로 분류할 수 있는데, 내장함수는 php를 설치할 때 기본적으로 제공되는 함수를 말하며, 사용자가 새로운 함수를 만들어 사용할 수도 있습니다.

이 름 설 명
내장 함수 PHP 에서 기본적으로 제공하는 함수
외장 함수 사용자가 만들어 사용하는 함수
익명 함수 이름을 지정하지 않은 함수

참고로 함수와 메소드의 차이에 이해를 돕기 위해 클래스 내부에는 변수나 함수를 선언하거나 정의할 수 있으며 이렇게 정의된 함수를 메소드라 부릅니다. 이 메소드는 클래스의 멤버이고, 클래스 외부에 정의된 것을 함수라 부릅니다.

사용자 함수는 function 이라는 예약어로 시작하고, 하나 이상의 인자(arguments)가 올 수 있습니다.

 // 인자가 없는 함수라면...
 function 함수이름 () { 함수내용 }

 // 인자가 하나 이상 있는 함수라면...
 function 함수이름 (매개변수1, 매개변수2 .... ){ 함수 내용 }

 // 반환 값이 있는 함수라면 return 문이 들어갑니다.
 function 함수이름 () { return arguments; }

사용자 정의 함수는 다음 세 가지 방식 중 하나를 사용하면 됩니다.

 // 기본적인 방식
 function 함수명 (){...}

 // 익명 함수를 참조하는 방식
 함수명 = function(){...}

 // 함수 호출없이 바로 동작하는 방식
 (function(){...})();




함수 선언(prototype)을 읽는 법

우선 함수 선언(prototype)을 읽는 법을 알아야 합니다.

 bool in_array ( mixed $needle, array $haystack [, bool $strict])

의미
bool in_array ( mixed $needle, array $haystack [, bool $strict] )
┗ 반환값 ┗ 함수이름 ┗ ( 인자형, $인자이름 )

"bool"은 불형으로 true거나 false로 반환한다는 뜻입니다. "mixed"는 스칼라 값(문자열, 정수, 실수)이나 배열(Array)이 될 수 있습니다. 세번째 선택적인 인자 이름을 strict 이라 하며, 모든 선택적인 인자는 [ 브라켓 ]사이에 들어 갑니다. 매뉴얼에 strict 인자의 기본값은 bool FALSE로 나와 있습니다.

의미
int strlen ( string $string )
┗ 반환값 ┗ 함수이름 ┗ ( 인자형, $인자이름 )

위 함수 선언을 일반적인 방법으로 다시 작성할 수 있습니다.

부 분 설 명
strlen 함수이름.
int 반환 값은 integer형. (즉, 문자열의 길이가 숫자로 측정됨)
(string $string) 이 함수의 처음 (이 경우는 하나뿐인) 인자는 string 이라는 이름을 가지는 string형입니다.

필요적 조건으로 타입에 대한 기본적 이해는 중요합니다. 타입은 다음 표와 같습니다.

# 이 름 설 명
스칼라 형 booleans 부울형, bool로 정의
integer 정수형, int로 정의
float (소수, double) 실수형, double로 정의
string 문자열형
복합 형 array 배열형
object 객체형
특별 형 resource 원천 자원
null 비어 있는 값
모의 형 mixed 문자열, 정수, 실수, 배열
number 정수, 실수
callback 함수나 클레스의 호출
void 인자 비워둠




사용자 선언 함수

함수 이름은 변수 이름의 규칙에 따라 자유롭게 문자나 _로 시작하여 문자, 숫자, 그리고 _를 여러 개 가질 수 있지만 특수문자는 사용할 수 없습니다. 다음은 하나의 인자를 사용하여 정의하였습니다.

<?php 
 function test($arg = 'value') { 
    $retval = 125; 
    echo " $arg 예제 함수.\n"; 
    return $retval; 
 } 

 test(); // 결과: value 예제 함수. 

 echo test(); // 결과: value 예제 함수. 125

 test("좋은"); // 결과: 좋은 예제 함수 

 $a = "참"; 
 $good = test($a); 
 echo $good; // 결과: 참 예제 함수 125
 ?>

하나 이상의 인자를 사용할 경우 쉼표로(,)로 구분해서 사용하면 되는데, 다음과 같이 작성해 줍니다.

<?php 
 function test($arg1,$arg2,$arg3='bool') { 
    echo " 예제 함수.\n"; 
 } 

 $a = 1; 
 $b = 2; 
 test($a,$b,$c); 
 ?>

여기서 $a, $b, $c는 인자라 하고, $arg1, $arg2, $arg3은 파라미터(parameter)라 합니다.

$arg3='bool'은 인자에 전달된 변수가 없으면, "bool"을 디폴트로 사용하겠다는 것입니다. 만약, 디폴트 값이 있으면 인자를 비워도 괜찮지만, 없으면 인자를 비워 두어서는 안됩니다.

<?php 
 function test($a,$b,$c) { 
      echo "테스트"; 
 } 

 test($a,$b); // 결과: $c에 디폴트 값이 없으므로 작동하지 않고, PHP 오류 표시가 나옵니다. 
 ?>

인자에 배열이 올 수도 있고, 반환 값이 배열이 될 수도 있습니다.

<?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. 
 */ 

 function mcoffee($types = array("카푸치노"), $coffeeMaker = NULL) { 
    $device = is_null($coffeeMaker) ? "손" : $coffeeMaker; 
    return "$device(으)로 ".join(", ", $types)."를 만듭니다.\n"; 
 } 
 echo mcoffee(); 
 echo mcoffee(array("카푸치노", "에스프레소"), "찻주전자"); 

 /* 
 결과: 
 손(으)로 카푸치노를 만듭니다. 
 찻주전자(으)로 카푸치노, 에스프레소를 만듭니다.  
 */ 

 function returncoffee() { 
    $arr = array("카푸치노", "에스프레소"); 
    return $arr; 
 } 
 $arr = returncoffee(); 
 print_r($arr); 

 /* 
 결과: 
  Array 
 ( 
    [0] => 카푸치노 
    [1] => 에스프레소
 ) 
 */ 
 ?>


반환문

반환문은 for문이나, while문과 같은 루프형이나 함수, 클레스 내에 호출된다면, 함수나 루프의 수행을 즉시 끝내고, return에 결과 값을 넘겨줄 수 있습니다.

<?php 
 function returncoffee() { 
    $coffee = " 는 맛이 좋습니다." 
    return "카푸치노" . $coffee; 
 } 
 echo returncoffee(); // 결과: 카푸치노 는 맛이 좋습니다. 

 // 이 함수는 반환값을 갖지 않습니다. 
 function voidcoffee() { 
    $coffee = " 는 맛이 좋습니다." 
    return; 
 } 
 echo voidcoffee(); // 결과: 
 ?>

반환문은 함수가 아니라 언어구조이기 때문에 괄호로 묶을 필요는 없습니다. 이는 일반적인 것으로 PHP가 더 적은 일을 하게 합니다만 괄호를 사용해도 큰 문제는 없습니다.

<?php 
 function small_numbers() { 
    return array (0, 1, 2); 
 } 
 list ($zero, $one, $two) = small_numbers(); 
 echo "$zero, $one, $two"; // 결과: 0, 1, 2 

 function myfunc1() { 
    return('thingy' or die('otherthingy')); 
 } 
 function myfunc2() { 
    return 'thingy' or die('otherthingy'); 
 } 
 function myfunc3() { 
    return('thingy') or die('otherthingy'); 
 } 
 function myfunc4() { 
    return 'thingy' or 'otherthingy'; 
 } 
 function myfunc5() { 
    $x = 'thingy' or 'otherthingy'; return $x; 
 } 
 echo myfunc1(). "\n". myfunc2(). "\n". myfunc3(). "\n". myfunc4()
. "\n". myfunc5(). "\n"; 
 // 결과: 1 1 1 1 thingy 
 ?>

다음은 반환 값을 갖지 않지만, global로 대신할 수 있습니다.

<?php 
 function writefunctionvars() { 
    global $foo; 
    $foo = "something"; 
 } 
 writefunctionvars(); 
 echo $foo; // 결과: something 

 function writefunctionvars2() { 
    global $foo2; 
    $foo2[] = "something"; 
    $foo2[] = "body"; 
 } 
 writefunctionvars2(); 
 print_r($foo2); // 결과: Array ( [0] => something [1] => body )  
 ?>


재귀 호출

재귀호출은 함수인 자기 자신을 호출하는 것을 말합니다.

<?php 
 function recursion($a){ 
    if ($a < 20) { 
        echo "$a\n"; 
        recursion($a + 1); 
    } 
 } 

 $a = 1; 
 recursion($a); // 결과: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 

 function recursion2($a) { 
    if ($a < 10) { 
        echo "before: ".$a."\n"; 
        recursion2($a + 1); 
        echo "after: ".$a."\n"; 
    } 
 } 
 recursion2(0); 
 /* 
 결과: 
 before: 0 before: 1 before: 2 before: 3 before: 4 before: 5 before: 6 
before: 7
 before: 8 before: 9 after: 9 after: 8 after: 7 after: 6 after: 5 
after: 4 after:  3 after: 2 
 */ 
 ?>


익명 함수 

익명함수는 이름을 지정하지 않은 함수를 말합니다. 이 기능은 (PHP 5.3)부터 사용가능합니다.

<?php 
 $result = 0; 

 $one = function(){ 
      var_dump($result); 
 }; 
 $two = function() use ($result){ 
      var_dump($result); 
 }; 
 $three = function() use (&$result){ 
      var_dump($result); 
 }; 

 $result++; 

 $one();    // 결과:  
 $two();    //  결과: 0 
 $three();    //  결과: 1 
 ?>


스스로 동작하는 함수 

보통 함수를 정의하고, 호출해야 되는 반면 이 방식은 함수를 정의한 부분에서 바로 그 함수를 호출하는 것입니다.

<?php
(function(){ echo "안녕 하보니"; })()
?>

<?php
(function(){
  for($i = 1; $i <= 10; $i++){ 
    echo $i + " ";
  }
})()
// 1 2 3 4 5 6 7 8 9 10
?>

0 댓글