PHP

7.1 사용자 정의 함수 (user define function)

 

사용자 정의 함수는 다음과 같이 정의한다.

 

function tmp ($arg_1, $arg_2, …., $arg_n){

        echo “Example function. <br>\n”

        return $retval;

        }

 

함수 안에는 다른 함수는 class의 선언 등을 포함한 모든 가능한 PHP 코드가 사용될 수 있 다. PHP3에서 함수는 함수가 사용되기 이전에 선언되어 있어야 하였나 PHP4/PHP5에서는 이런 제약이 없어졌다.

PHP는 function overloading을 지원하지 않고, 이미 정의된 함수를 재 정의하거나 없애지 못한다. PHP3에서는 함수 인수(parameter) 의 기본 값을 설정해주는 것 (default argument values를 보자.) 은 가능해도, 인수의 개수를 가변적으로 설정하는 서은 불가능했지만, PHP4/PHP5 는 두 가지 모드 가능하다.

 

7.2 함수의 구성(function composition)

 

모든 함수는 그 함수에 대한 사항을 설명하는 함수의 헤더로부터 시작한다. 함수의 헤더는 다음과 같은 요소로 이루어진다.

function_name (parameter declarations)

함수이름  / 형식 전달 인수들

 

함수의 정의는 함수가 어떤 기능을 수행할 수 있도록 명령어가 나열된 부분으로 함수를 호출하기 위해서는 반드시 함수의 정의가 존재해야 한다. 함수 정의부는 함수명, 형식 전달 인수들, 함수의 본문 등 세 가지로 구성되어 있다.

 

다음은 함수의 이름을 명시한다. 함수의 이름은 변수의 이름을 할당하는 것과 같은 규칙에 의해 부여될 수 있으며, 함수의 작업 특성을  나타낼 수 있는 이름을 부여하면 사용자가 이해하기 쉽다.

 

형식 전달 인수(가인수)들은 호출한 프로그램으로부터 값을 전달바디 위한 매개 변수를 선언하는 부분이다. 경우에 따라서 이러한 인수들은 생략이 가능한데, 인수를 포함하지 않더라도 괄호는 생략할 수 없다. 함수의 매개변수 목록 선언의 일반적인 예는 다음과 같다.

func($a, $b, $c)

 

함수의 매개변수(가인수)는 각각의 이름을 명시해야만 한다.

 

함수의 본문(몸체)은 모든 함수의 내용을 기록하는 부분으로서 중괄호({ }) 내에 포함되는 모든 문장을 의미한다. 즉, 함수 내부의 어떤 기능을 수행하기 위해서 변수 선언과 명령문의 집합으로 구성된다.

함수의 반환 값은 호출한 프로그램에 값을 돌려주기 위한 반환 값을 갖는다. 반환형은 모든 데이터형을 사용할 수 있으며, PHP에서는 반환되는 값에 따라 데이터 type은 자동으로 기본(default)값으로 반환하므로 걱정 없이 사용하여도 된다.

인수(parameter, argument list)를 통해 함수에 어떤 정보를 넘겨줄 수 있다. 이 인수들ㅇㄴ 쉼표(,)로 나누어진 변수나 상수의 list이다. PHP는 passing by value(기본적으로 이것을 사용) 와 passing by reference, default argument values의 3가지 방법을 제공한다. 가변길이(Variable-length) 인수들은 PHP4이후에서만 제공된다. 자세한 내용은 variable-length argument list 와 func_num_args(), func_get_arg(), func_get_args() 의 함수 설명을 보기 바란다. 그러나 PHP3에서도 배열을 통한 전달을 사용한다면 비슷한 효과를 낼 수 있다.

function take_array ($input) {

 

  echo “\$input[0] +\$input[1] = ”, $input[0] + $input[1];

 

}

 

 

7.3 값에 의한 호출 ( call by value)

 

PHP 언어에서는 다른 언어에서 사용되는 함수 사이의 데이터 전달 방법과는 달리 함수가 호출되면 실인수로 사용되는 수식은 결과 값을 스택에 복사하고, 가인수는 스택에 복사된 데이터를 가져와 함수에서 사용하는 값에 의한 호출(Call by value) 방법을 사용한다. 따라서, PHP 언어에서는 호출 함수에서 호출 당한 함수(피 호출 함수)에 값을 주는 방식이므로, 피호출 함수에서 인수 값을 바꾸더라도 호출 함수의 실인수에 접근할 수 없어서 호출 함수에는 영향을 주지 못한다.

다음 예제는 값에 의한 호출한 경우이다. 이 경우 실인수($a, $b)와 가인수($a, $b)가 동일한 변수명이지만, 이 변수들은 각각 다은 기억 장소를 차지하게 된다. 실인수 ($a, $b)가 가지고 있는 값을 가인수 ($a, $b) 에 차례로 복사하여 가인수 ($a, $b)의 값에 의해 작업을 수 행한다. $c = add_value($a, $b) ;에서 30이 반환되어 $c 가 30이 되지만, 본래의 실인수($a)의 값은 변함이 없으므로 $a 는 10 이 된다.

 

<?

  function add_value($a, $b){        // 가인수 $a, $b

     $a += $b;

     return $a;

  }

  $c  = add_value($a = 10, $b = 20); // 실인수 $a, $b

  echo “변수 a => $a,  변수 b => $b, 변수 c => $c <br>”

?>

-> 출력

변수 a => 10, 변수 b => 20, 변수 c => 30

 

값에 의한 호출 방법은 실인수와 가인수가 별도의 기억 장소를 차지하므로 호출 당한 함수의 가인수에 잘못된 데이터를 사용하더라도 호출한 함수는 아무런 영향을 받지 않기 때문에, 모듈간의 독립성을 유지하는 장점이 있으나, 기억 장소의 낭비가 발생하고, 전달 인수가 많을 때 데이터를 전달하는데 걸리는 시간이 더 필요 하다는 단점도 있다.

 

다음 예제는 0부터 $a =100 까지 2의 배수 값을 합산하는 프로그램으로 반환 값 $sum을 호출 함수로 반환하여 출력시키는 프로그램이다.

 

<?

function add_value($a)   //함수 정의

{

     $sum =0;

     for($i=0; $i <= $a ; $i +=2)

     $sum +=$i;

     return $sum;

 

}

 

$c =add_value($a =100); //함수 호출

 

echo “변수 a=> $a, 변수 c => $c <br>”

?>

 

-> 출력

변수 a=> 100, 변수 c => 2550

 

다음 예제는 각도를 입력하여 호도(radian) 값을 구해 sin() 값을 구하는 예제 프로그램으로 $a 는 각도를 나타내며 sin (90 ) 은 1이다.

 

$ran = sin($a / 180.0*3.141592654);

 

<?

     function ran_value($a)            

     {

         $ran = sin($a / 180.0 * 3.141592654);       //호도(raian)을 구함

         return $ran;

     }

     $c  = ran_value($a = 90);                             //  함수 호출

     echo “변수 a => $a,  sin(90) => $c <br>”

?>

->출력

변수 a => 90, sin(90) => 1

 

 

 

7.4 참조에 의한 호출 (call by reference)

 

값이 저장되어 있는 주소를 직접 매개 변수로 사용할 수 있다. 즉, 포인터를 매개 변수(인수)로 사용함으로써 주소에 의한 함수의 호출이 가능해진다. 이 방법은 일반 언어에서 주로 사용되고 있으며, 기억 장소의 실제 주소를 대신하는 변수명을 가지고 장소에 접근하는 직접참조와 기억 장소의 주소를 사용하여 접근하는 간접참조가 있다.

간접 참조는 PHP 와 C 언어에서만 존재하는 포인터를 사용하고 포인터 변수와 변수의 주소를 다루는 주소 연산자 (‘&’)를 이용하여 기억 장소를 참조하는 방법이다.

(오류 – 추천하지 않습니다.– Deprecated )

기본적으로 함수의 인수(argument) 들은 값(call by value) 으로 전달된다. 함수 내에서 변화시킨 값을 그대로 유지하려면 참조호출 (call by reference) 로 인수를 넘겨야 한다.

 

값에 의한 호출이 실인수(상수, 변수, 함수, 연산자)를 사용하는 반면에, 참조호출(call by reference) 은 포인터를 이용하여 함수를 호출하는 기법으로서 실인수는 주소(l-value)이며, 피호출 함수의 가인수는 변수의 주소를 가질 수 있는 포인터 변수가 사용되어야 한다. 따라서 참조호출은 호출함수의 실인수로 사용된 변수 값은 피호출 함수의 반화 값에 의해 호출 함수의 저장된 값을 변경할 수 있다.

 

“swap.php” 예제는 두 인수 $a, $b 에 저장된 값을 참조 호출하여 호출 함수의 실인수 값을 서로 교환(swap) 하여 변경하는 함수를 사용한 예이다.

<?

    function swap($x, $y) {

       $temp = $x;

        $x = $y;

       $y = $temp;

      echo “swap( ) 이후 : 변수  a => $x, 변수 b => $y <br>” ;

    }

    $a = 10; $b = 20;

    echo “swap( ) 이전 : 변수 a => $a, 변수 b => $b <br>” ;

    swap($a, $b);

    

    

?>

->출력

swap( ) 이전 : 변수 a => 10, 변수 b => 20
swap( ) 이후 : 변수 a => 20, 변수 b => 10

 

 

7.5 재귀 호출 함수 (recursive call function)

 

재귀 호출이란 문자 그대로 어떤 함수가 자기 자신을 직접 또는 간접적으로 다시 호출하는 되부름의 경우이다.

 

“recursivel1.php” 예제는 자기 자신 (sub() 함수)을 호출하는 직접 순환 프로그램으로 $i 값이 5보다 작을 때 재귀 호출한다. 이 때, if($i < 5) 문이 존재하지 않으면 무한 루프에서 빠져 작업 종료가 되지 않는다. 무한루프를 빠져나오기 위해서 if 문을 사용하여 $i 가 5가 되면 if 문을 빠져나와 프로그램을 종료한다.

<?

  $i = 0;   $sum = 0;

  function sub($i) {

    if ($i < 5) {

        global $i, $sum; // 전역변수 선언

        echo “변수 i => $i, 변수 sum => $sum <br>”

        $i++;

        $sum += 10;

        sub($i);         //  sub( ) 함수 재귀 호출

    }

  }

  sub($i);               // sub( ) 함수 호출

?>

->출력

변수 i => 0, 변수 sum => 0
변수 i => 1, 변수 sum => 10
변수 i => 2, 변수 sum => 20
변수 i => 3, 변수 sum => 30
변수 i => 4, 변수 sum => 40

 

다음은 두 개의 함수가 상반되는 다른 함수를 호출하는 간접 순환 재귀호출 예제이다. sub1()함수 호출하면 if()문에서 $i 값을 비교하여 5이하면 sub2() 함수를 호출하고 sub2() 에서는 $i 값을 1씩 증가하고, $sum 값에는 10씩 더해준 후 다시 sub1()를 재귀 호출한다.

<?

   $i = 0;   $sum = 0;

   function sub1($i) {

      if ($i < 5)  sub2($i);

   }    

   function sub2($i) {

      global $i, $sum;  // 전역 변수 선언

      echo “변수 i => $i, 변수  sum => $sum <br>”

      $i++;

      $sum += 10;

      sub1($i);         //  sub( ) 함수 재귀 호출

   }

   sub1($i);            // sub( ) 함수 호출

?>

->출력

변수 i => 0, 변수 sum => 0
변수 i => 1, 변수 sum => 10
변수 i => 2, 변수 sum => 20
변수 i => 3, 변수 sum => 30
변수 i => 4, 변수 sum => 40

 

다음은 “facto_main.php”에서 입력한 수(n)의 팩토리얼(n!)을 구하는 예제 프로그램이다.

 

 

<!DOCTYPE html>

<html>

<head>

<meta charset=“UTF-8”>

<title>재귀함수 호출 구하기</title>

</head>

<body>

 

<form action=“facto.php” method=“post”>

 

출력하고 싶은 n! 숫자를 입력하세요

<input name=“value” type=“text” >

 

<input type=“submit” value=“확인”>

 

</form>

 

 

</body>

</html

 

출력하고 싶은 n! 숫자를 입력하세요

 

<?php

    

$value =$_POST[“value”];

function facto($value){

 

   if($value <=1) return 1;

 

  else return $value * facto($value-1);

 

}

echo “$value 팩토리얼은 “. facto($value). “이다 <br>”

 

?>

->출력

6 팩토리얼은 720이다

 

 

 

7.6 인수들의 기본값 (parmeter basic value)

 

스칼라 인수는 다음 예제와 같이 C++ 와 유사하게 기본 값을 정해줄 수 있다. 기본 값은 반드시 상수이어야 한다. 예를 들어 변수나 class의 멤버를 사용해서는 안된다. 다음 예제는 make_tea() 함수의 인자 값을 문자열 상수로 사용한 경우이다.

<?

     function make_tea ($type = “카푸치노”) {

           return “$type : 한 잔 주문…<br>”

     }

     echo make_tea ();

     echo make_tea (“맥스웰”);

?>

->출력

카푸치노 : 한 잔 주문…
맥스웰 : 한 잔 주문…

 

PHP에서는 정의되지 않은 값을 함수의 기본인수로 지정할 수 있다. 이것은 해당 인수에 값이 제공되지 않으면, 절대로 값을 설정하지 않는 다는 것을 의미한다. 기본인자를 사용할 때, 기본 값이 되는 인수들은 non-default 인 인수들보다 오른쪽에 위치해야 한다. 그렇지 않으면 원하는 결과가 나오지 않는다.

 

다음 “product.php” 예제는 make_yogurt() 함수의 인수로 $product는 기본 인수로 사용되었고, $type은 기본이 아닌 인수로 사용되었다.

 

<?

       function make_yogurt ($product, $type = “남양유업(wn)”) {

          

         return “$type 에서 만든 $product 는 유산균 우유이다..”

      

      }

      

      echo make_yogurt (“남양요구르트”);

?>

->출력

남양유업(wn) 에서 만든 남양요구르트 는 유산균 우유이다..

 

 

7.7 가변길이 인수 (variable length parameter)

 

PHP에서는 사용자 정의 함수에 가변길이 인수를 제공한다. func_num_args(), func_get_arg(), func_get_args()의 함수를 사용하여 함수의 인수의 개수나 인수의 값을 쉽게 알 수 있다. func_num_args() 함수를 함수에 정의된 인수의 개수를 반환하고, func_get_arg() 함수는 함수의 인수를 받아들이고, func_get_args() 함수는 함수의 인수 전체 list를 반환한다.

 

<?

       function num ( ) {

             $numargs = func_num_args();

             echo “num() 함수의 인수 개수 : $numargs <br>\n”

             echo “세 번째 인수의 값 : ” . func_get_arg(2) . “<br>\n”

             $arg_list = func_get_args();

             for ($i = 0; $i < $numargs; $i++)

                      echo “인수($i) 값 : “ . $arg_list[$i] . “<br>\n”

       }

       num(“한식”, “중식”, “일식”, “양식”);

?>

 

->출력

num() 함수의 인수 개수 : 4
세 번째 인수의 값 : 일식
인수(0) 값 : 한식
인수(1) 값 : 중식
인수(2) 값 : 일식
인수(3) 값 : 양식

 

7.8 return 문을 통한 여러 개의 함수 값 전달

 

함수 호출시 return 문을 사용하여 여러 개의 반환 값을 돌려줄 수는 없지만 list() 함수를 사용하면 함수 호출시 사용한 여러 개의 list와 object를 포함한 어떤 type도 함수 값을 반환 할 수 있다. list() 함수는 주로 배열의 값을 임의로 추출할 때 쓰이며 데이터베이스의 한행을 추출할 때도 사용한다.

 

다음 예제는 list() 함수를 이용하여 여러 개의 반환 값을 전달하는 예제로 아래와 같이 num() 함수를 호출하여 num()함수의 반환 값을 list() 함수의 인수에 전달하므로 $zero 에 0 $one 에 1, $two에 2를 반환해주었다. 그리고 $sports[] 의 1차원 배열을 list() 함수를 이용하여 $sports[] 배열에 저장된 값을 출력하였다.

 

<?

function num(){

   return array(0, 1, 2);

}

list ($zero, $one, $two) =num();

echo(“num() 함수의 반환 값 :$zero $one $two <br>\n”);

 

$sports=array(“축구”, “배구”, “농구”, “야구”);

for( $i=0; $i<sizeof($sports); $i++){

   list($key, $value) =each($sports);

    echo $value.“<br>”

}

?>

->출력

num() 함수의 반환 값 :0 1 2
축구
배구
농구
야구

 

7.9 가변 함수 (variable function)

 

PHP는 가변 함수 개념을 지원한다. 변수명 뒤에 괄호가 왔을 때, PHP는 그 이름을 가진 함수를 찾아 실행한다는 것을 의미한다. 이 기능은 callbacks, function table 등의 기능에 사용하면 매우 유용하게 사용할 수 있다.

다음 “variable.php”는 tmp() 함수와 bar($arg)함수를 정의하여, $func = ‘tmp’ 는 tmp(0함수를 $func 가변함수로 지정해서 $func() 함수를 호출하였다. $func() 함수 호출시 ‘Welcomd to Korea’ 인수 값을 가지고 호출하면 $arg 인수에 값이 전달되어 $arg 값이 ‘Welcome to Korea’ 가 된다.

<?

        function tmp( ) {

             echo “tmp() 함수 호출<br>\n”

        }

        function bar($arg) {

             echo “bar() 함수 호출 : 인자 값 ‘$arg‘.<br>\n”

        }

       

        $func = “tmp”   //  tmp() 함수를 $func 가변 함수로 지정

        $func();         //  tmp() 함수 호출

        $func = ‘bar’   //  bar() 함수를 $func 가변 함수로 지정

        $func(‘Welcome to Korea’);

?>

->출력

tmp() 함수 호출
bar() 함수 호출 : 인자 값 ‘Welcome to Korea’.

 

 

 

 

 

 

 

 

 

7.10 정규 표현식 함수 (regular expression function)

 

정규

 

 


$subject = “00:01-02:00”;

$pattern = ‘/\d\d/’;

preg_match_all($pattern, $subject, $matches);

$matches에 들어가는 결과물

Array

(

[0] => Array

(

[0] => 00

[1] => 01

[2] => 02

[3] => 00

)

)

 

//—————— 2015.02.02 추가

if( !preg_match(‘/jpeg|gif|pdf|bmp|png/i’, $Ftype[1]) ) echo “no match!”; //넘어온 파일의 확장자 검사

if( preg_match(‘/^DEFAULT|^’.$code.’/i’, $tval[‘d’]) ) echo “match!”; //해당 문자로 시작하는 배열요소인지 검사

 

 

//—————— 2015.03.06 추가

//공백을 제외한 것들만 배열 요소로 만드는 방법

$str = ” aa bb cc dd ese se “;

$matches = preg_split(‘/[\s]+/i’, trim($str));

 

preg_match_all(‘/[^\s]+/’,$str,$matches);

 

$matches = preg_split(‘/\s+/’,$str,-1,1);

 

$matches = preg_split(‘/\s/’,$str,-1,1);

 

while ( strpos($str,’ ‘)!==false ) $str = str_replace(‘ ‘,’ ‘,$str); // 문제 없음. 나쁘지 않음. 빠름.

$str = trim($str);

$matches = explode(‘ ‘,$str);

Array

(

[0] => aa

[1] => bb

[2] => cc

[3] => dd

[4] => ese

[5] => se

)

 

//—————— 2015.09.30 추가

//<code></code>에 있는 값들만 가져오기

$str = “efeavadvq3rvae<code> aaaaaaaaaaaaaa<br><html></code>aaaaaaaaa><>

LPML:OP?’;ojao;dsfnewwklvZ<?>sd;oqmdasdofio;2u34211j45390568401233721-!@#$!@#$%^%^#&^$*&^$~!@

23$!@423<code>adfgdsgfsgfsd2015-09-30</code>asdfawee”;

 

preg_match_all(“/\<code\>(.*)\<\/code\>/”, $str, $arr);

 

echo “<pre>”;

print_r( $arr );

Array( [0] => Array ( [0] => <code> aaaaaaaaaaaaaa<br><html></code> [1] => <code>adfgdsgfsgfsd2015-09-30</code> )
[1] => Array ( [0] => aaaaaaaaaaaaaa<br><html> [1] => adfgdsgfsgfsd2015-09-30 )
)

 

 

 

[출처] [PHP] 정규 표현식 모음|작성자 b1ix

 

 

 

 

 

 

 

 

7.10.2  preg_replace()

 

foreach(array($Course1, $ListBox2) as $value) {

 

 

         $num= preg_replace(“/[^0-9]*/s”, “”, $value);

          echo $num;

 

          $total +=$num;

        }

 

 

<?php

$subject = ‘{ startDate } = 1999-5-27’

 

 

$pattern = array (‘/^\s*{(\w+)}\s*=/’,‘/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/’);

 

 

$replacement = array(‘$\1 =’,‘\3/\4/\1\2’);

 

 

echo preg_replace($pattern, $replacement, $subject);

?>

 

->출력

{ startDate } = 5/27/1999

 

about author

PHRASE

Level 60  머나먼나라

마땅히 행할 길을 아이에게 가르쳐라. 그러하면 늙어도 그것을 떠나지 않으리라.

댓글 ( 4)

댓글 남기기

작성

PHP 목록    more