본문 바로가기

Web Development/PHP

[PHP] 함수에 대해서

함수는 반복된 작업이나 복잡한 로직을 하나의 묶음으로 만들어 사용하는 프로그래밍 문법입니다.

함수는 PHP함수와 사용자 정의 함수가 있습니다.
PHP함수는 PHP메뉴얼에 있는 미리 정의된 함수이며 사용자 정의함수는 사용자가 자유롭게 만든 함수입니다.
여기서는 사용자 정의 함수에 대해 알아봅니다.

 

사용자 정의 함수 선언

함수는 다음과 같이 선언을 합니다.

<?php
function 함수명 ($인자1,$인자2,$인자3 ... )
{
   echo "아름다운 날들의 연속!";
   return 되돌려줄값 ;
}
?>

함수명은 PHP함수와 같으면 안되면서 변수명 규칙과 같이 생성하시면 됩니다.
인자는 제한된 갯수가 없으며 함수 호출시에 함수 내부에 전해줄 값입니다.

앞서 제어구조에서 배웠듯이 return문을 만나면 함수는 종료하며 수행결과를 되돌려줍니다.

 

사용자 정의 함수 예제 모음

예제1

<?

function show()
{
 echo "출력을 합니다.";
}

show();

echo "함수 사용하기?";

show();

?>

위의 소스는 단지 정적인 출력만을 하는 함수를 선언하고 2번 함수를 실행했습니다.

예제2

<?

show("함수 이용해 출력하기");

function show($msg)
{
 echo $msg . "<br>";
}

show("함수 이용해 출력하기");

?>

위의 소스는 동적인 출력만을 하는 함수를 선언했습니다.

문자열을 넘겨주어 그 문자열을 출력하는 함수입니다. echo "";문과 비교하면 비슷해 보이지만

함수는 더욱더 복잡한 로직도 처리가 가능합니다. 그것이 echo "";와 다른점입니다.

예제3

<?

echo " 합은 ? " . sum(4,9);

function sum($a,$b)
{
 return $a+$b;
}

echo "<br>";

echo " 합은 ? " . sum(12,22);

?>

위의 소스는 2개의 값을 받아서 더한값을 리턴해주는 함수입니다.

return예약어로 리턴이 가능하며 함수 실행후에 리턴값을 받을수 있게 코딩해야 합니다.

echo " 합은 ? " . sum(12,22); 문처럼 뭔가 받은 값을 처리할수 있게 해야 하며 아래와 같이

sum(12,22); 하게 되면 에러는 안나지만 화면에는 아무것도 출력이 안됩니다.

예제4

<?

$use = true;

bar();

//참인 경우에만 함수가 선언됩니다.
//여기까지는 아직 함수가 선언되지 않았습니다.
if ($use){
  function foo() {  echo "조건부 함수"; }
}

//이제 함수가 선언되었으니 호출해 볼까요?
foo();

function bar()
{
    echo "호출부분 아래에 함수가 정의되어도 괜찮아요~";
}

?>

예제4에서 두가지를 알 수 있습니다.
한가지는 함수 선언이 나중에 되어 있어도 호출이 가능하다.
또 한가지는 조건적으로 함수를 선언할 수 있다.
만약 $use 가 false 이거나 선언전에 호출을 한다면 함수가 정의되지 않았다는 심각한 에러를 맛보게 될 것입니다.




다양한 데이타형을 받는 함수 예제

<?


function ShowMsg($msg)
{
 echo $msg;
}

function Sum($value1,$value2)
{
 return $value1+$value2;
}

function Div($value1,$value2)
{
 return $value1/$value2;
}

function Boolean($boo)
{
 if($boo)

   echo "참";

 else

   echo "거짓";
}

ShowMsg("PHP짱");

echo Sum(20,20);

echo Div(42.0,5.0);

echo Boolean(true);

?>

 

4개의 함수를 선언하고 4개의 함수를 각각 실행했습니다.

위에서부터 받는 데이타을 문자열,정수,실수,진리값 데이타형을 사용했습니다.

그리고 ShowMsg함수를 제외한 3개의 함수는 반환값(리턴값)을 주어서 함수 종료시 값을 리턴해주어 화면에 출력합니다.

 

함수안의 함수 선언

<?

function foo()
{
      function bar()
      {
       echo "foo()를 호출하기 전까지는 존재하지 않습니다.\n";
      }
}

foo();

bar();
?>

이 소스는 좀 복잡합니다. 함수안에 함수를 정의하였습니다.
 
foo()함수가 호출되기 전까지는 bar()함수 사용이 불가능합니다.
 foo()함수가 호출이 되고 나면 foo()함수안의 함수가 선언되어지고 그 이후부터 bar()함수 사용이 가능하게 됩니다.

 

여기서 잠깐
PHP는 함수 오버로딩(function overloading)을 지원하지 않습니다.
함수 오버로딩이란 함수의 이름이 같으면서
인자의 데이터형이나 인자의 수가 다른 것을 서로 다른 함수로 받아들이는 것을 말합니다.

따라서 같은 이름의 함수나 이미 선언된 함수명은 절대 사용할 수 없습니다.

 

함수에 인자 넘겨주기

PHP에서 함수에 인자를 넘겨주는 세가지 방법이 있습니다.
기본적으로 값에 의한 전달, 참조에 의한 전달, 기본 인자값. 이 세가지입니다.

 

1) 값에 의한 전달 (passing by value)

 

<?

function test_function($args)
{
 echo $args;
}

$value="백골";

test_function($value);

?>

 

위와 같이 변수를 통해 값을 전달하는게 "값에 의한 전달"입니다.

보통 쓰는 방식이며 이 방법을 통해 단일변수가 아닌 배열변수도 전달이 가능합니다.

 

여기서 잠깐
배열을 인자를 통해 전달하는 것은 엄연히 따지면 값에 의한 전달이 아닙니다.
그러나 PHP에는 포인터 개념이 없으므로 그저 값에 의한 전달에 보셔도 상관없습니다.

저번 시간에는 함수에 인자 넘겨주기 방법중에서 값에 의한 전달을 했습니다.

오늘은 참조에 의한 전달 (passing by reference)을 해보겠습니다.

아래 예제를 한번 해보세요

<?php


function add_str (&$string)
{
   $string .= 'PHP 따라잡기';
}

 

$str = '윤정이와 함께하는 ';
add_str ($str);
echo $str;

?>

function명인 add_str안에 인자를 받습니다. string이라는 변수로 받는데 &가 붙었네요.

&가 붙으면 그 인자는 값을 받는게 아니라 값을 보내준 변수의 주소값을 받습니다.

이말을 좀더 쉽게 애기하면 add_str ($str); 문이 실행될때 $str변수를 보내주고 &$string으로 값을 받습니다.

이때 &$string은 'PHP 따라잡기' 문자열을 받는게 아니라 $str을 가리키는 참조를 받는다는겁니다.
그래서 함수안에서 $string .= 'PHP 따라잡기'; 명령이 실행되면
$string변수의 값이 변하도 하지만 실제로는 참조당하는 $str변수가 변하게 됩니다.

실제로 $str 과 $string 은 이름만 다를뿐 같은 변수입니다.

 

이번에는 기본 인자값에 대해서 알아보겠습니다.

아래 예제를 보겠습니다.

<?php


function ezphp_net ($url = "http://ysaraha.ttongfly.net")
{
   return "홈페이지 주소 : $url<BR>";
}


echo ezphp_net ();
echo ezphp_net ("
http://freely21c.ttongfly.net");

?>

위의 함수를 실행하면 어떤 특이한 점이 있을까요?

함수에 받는 인자값이 있다면 함수 실행시 부조건 값을 넘겨줘야 합니다.

안그러면 에러가 나서 프로그램이 멈추게 됩니다.

그런데 위의 함수는 $url라는 인자를 받게 됩니다.

그러면 함수실행시 무조건 인자를 넘겨줘야겠죠?

 

echo ezphp_net ();을 보면 인자가 업습니다.

하지만 아래꺼는 echo ezphp_net ("http://freely21c.ttongfly.net"); 인자가 있습니다.

echo ezphp_net (); 가 에러가 나야 하는데 안나네요? 그리고 정상적으로 값도 출력됩니다.

 

function ezphp_net ($url = "http://ysaraha.ttongfly.net") 이부분을 보시면

$url = "http://ysaraha.ttongfly.net" 가 있습니다.

위의 문법을 해석하면 함수실행시 인자를 쓰지 않으면 자동으로 http://ysaraha.ttongfly.net

대입하게 된다라고 알려주는겁니다. 상당히 편한 문법입니다.

 

한가지 알아두어야 할점은

인자가 여러개일 때 기본인자값을 설정할 인자를 제일 마지막에 두어야 한다는 것입니다.
약 처음 인자에 기본값을 지정한다면 에러를 발생하게 됩니다.

 

함수의 의미와 사용목적?

 

함수는 자주 쓰는 연산들을 하나로 묶어 하나의 명령으로 만드는 겁니다.

3줄 짜리 명령을 3번을 사용한다면 가정하면 아래와 같이 됩니다.

<?

 

echo "나는";

echo "너를";

echo "사랑한다.";

 

echo "나는";

echo "너를";

echo "사랑한다.";

 

echo "나는";

echo "너를";

echo "사랑한다.";

 

?>

위와 같이 소스를 코딩해야 합니다.
근데 3번이 아니라 예를들어 100번을 사용한다면

3*100=300줄 이상의 코딩을 해야 합니다.

그런데 위와같은 출력을 함수를 이용하면 어떻게 될까요?

<?

function show()

{

echo "나는";

echo "너를";

echo "사랑한다.";

}

 

show();

show();

show();

?>

위와같이 코딩할수 있습니다.
위와같은 방식으로 100번을 호출하면 6+100=106줄 정도의 코딩을 합니다.
 코딩량도 줄어들어서 서버는 더빨리 연산을 끝마칠것이며 사용자는 좀더 빨리 페이지를 보게 될것입니다.
이런 이유로 자주 사용하는 명령들은 함수로 묶어 관리하며 사용합니다.

 

함수예제 상세 설명?

예제1)

 01-    <?
 02-    function show()
 03-    {
 04-     echo "나는";
 05-     echo "너를";
 06-     echo "사랑한다.";
 07-    }

 08-    show();

 09-    show();
 10-    ?>

 

예제1 설명)

1번부터 PHP엔진은 해석을 시작하며

2번을 만나면 function 이라는 예약어를 보고 함수라고 알아채고 { 시작해서

7번의 } 까지 함수의 내용을 그냥 읽기만 합니다. 실행은 하지 않습니다.

8번에서 show();을 만나면 먼저 php함수인지 검사한후 아니라면 메모리의 사용자 함수

를 비교해보고 있다면 해당 함수가 있는 2번으로 가서 3번,4번,5번을 실행하고 6번의 }을

보고 함수의 끝이란걸 알고 다시 8번으로 와서 함수의 실행을 끝마치고

9번으로 가서 다시 show();함수를 보고 php함수인지 사용자 함수인지 체크한후 8번과 같은 순서로 실행을 한후 끝마치고 10번으로 가서 php 해석을 끝마칩니다.

 

예제2)

1-     <?
2-    function show($msg)
3-     {
4-      echo $msg;
5-     }

6-

7-     show("나는 너를 사랑한다.");

8-     ?>

 

예제2 설명)

1번부터 PHP엔진은 해석을 시작하며

2번을 만나면 function 이라는 예약어를 보고 함수라고 알아채고 { 시작해서

5번의 } 까지 함수의 내용을 그냥 읽기만 합니다. 실행은 하지 않습니다.

7번에서 show("나는 너를 사랑한다.");을 만나면 먼저 php함수인지 검사한후 아니라면 메모리의 사용자 함수를 비교해보고 있다면 해당 함수가 있는 2번으로 가면서 문자열 "나는 너를 사랑한다."을 같이 보냅니다. 그러면 2번줄에서 $msg에 "나는 너를 사랑한다."가 저장된후

4번을 실행합니다. 실행을 하면서 $msg을 출력합니다. 이 $msg라는 변수는 본 함수가 끝나면 소멸됩니다. 일회용입니다.4번을 실행후 5번의 }을 만나 함수를 종료한후 다시 7번으로 와서 함수실행을 끝마치고 8번으로 와서 php해석을 끝마칩니다.

 

예제3)

1-     <?
2-    function show($msg)
3-     {
4-      return $msg;
5-     }

6-

7-     echo show("나는 너를 사랑한다.");

8-     ?>

 

예제3 설명)

1번부터 PHP엔진은 해석을 시작하며 2번을 만나면 function 이라는 예약어를 보고 함수라고 알아채고 { 시작해서 5번의 } 까지 함수의 내용을 그냥 읽기만 합니다. 실행은 하지 않습니다.

7번에서 echo show("나는 너를 사랑한다.");을 만나면

먼저 echo 로 출력을 하는데 show("나는 너를 사랑한다.");을 보고 먼저 php함수인지 검사한후 아니라면 메모리의 사용자 함수를 비교해보고 있다면 해당 함수가 있는 2번으로 가면서 문자열 "나는 너를 사랑한다."을 같이 보냅니다.

그러면 2번줄에서 $msg에 "나는 너를 사랑한다."가 저장된후

4번을 실행합니다. 4번에서 retrn을 보면 그뒤에 명령이 더 있더라도 함수를 종료하면서

아까 7번에 있던 show("나는 너를 사랑한다."); 자리에  "나는 너를 사랑한다."을 리턴해주어  사실상 7번의 show("나는 너를 사랑한다.");가 "나는 너를 사랑한다." 로 변화게 됩니다.

그러고나서 7번의 echo문의 실행됩니다. "나는 너를 사랑한다."로 바뀌었으므로 화면에 "나는 너를 사랑한다." 라고 출력된후 8번으로 와서 php해석을 마칩니다.