본문 바로가기

프로그래밍 공부/PHP

PHP - 인수, 반환 값 그리고 전역 변수

인수

작성된 함수 한에서 사용하는 값을 함수 밖에서 전달할 수 있다. 이때 이 값을 인수라고 한다. 

1
2
3
4
5
6
7
8
9
10
<?php
    $myage = 19;
    check_adult($myage);
 
    function check_adult($age){
        $adult_age = 20;
        $adult_check = ($adult_age <= $age)? "성인" : "미성년";
        print $adult_check." 입니다.";
    }
?>
cs

위의 코드의 변수 $myage에 수치 19를 할당한다. 이 변수를 check_adult($myage);로 지정하면 변수 $myage는 인수로서 함수에 전달을 하게 되는 것이다.

인수의 기본값을 설정하는 것은 인수를 지정하지 않고 설정된 함수를 실행하면 오류가 발생하게 되는데, 이때 인수가 없어도 오류가 나지 않게 하려면 인수의 기본값을 설정해주면 인수가 없을 때 기본값으로 대체되어 오류 없이 처리를 실행하게 만든다.

1
2
3
4
5
6
7
8
9
10
<?php
    check_member();
    function check_member($username = "guest"$password = "guest"){
        if($username == "guest" && $password == "guest"){
            print " 게스트님 어서오세요!";
        }else{
            print "회원님 어서오세요!";
        }
    }
?>
cs

위의 코드는 사용자가 사이트의 회원인지 아닌지를 확인하는 함수 check_member에 기본값을 넣어 인수가 없을 경우 미리 넣어준 기본값 guest가 할당되도록 만든 것이다.

반환 값

return 값이라고도 한다. 사용자 정의 함수인 function에 값을 인수로 넘기면 결과로 데이터를 돌려받을 수 있는데, 함수의 값을 받으려면 반환 값을 뜻하는 return을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
    $str = "abcdefghijklmnop";
    $byte = 16;
    $flag = checkByte($str$byte);
 
    if($flag){
        print "OK입니다.";
    }else{
        print $byte;
        print "Byte를 초과하였습니다.";
    }
    function checkByte($str$byte){
        $strlen = strlen($str);
        if($strlen <= $byte){
            return true;
        }
        return false;
    }
?>
cs

checkByte 함수를 살펴보면, 인수로 넘겨받은 $str에 할당된 문자열은 PHP 내부 함수 strlen()에서 바이트 수를 검사하고 결과를 변수 $strlen에 할당한다. if문에서 $strlen과 $byte를 비교하고 지정된 바이트 이하일 경우 return을 이용해서 TRUR를 반환 값으로 가져온다. 그 이상일 경우 FALSE를 반환 값으로 가져오게 된다. 

여러 개의 값을 반환하는 것도 가능하다.

1
2
3
4
5
6
7
8
9
10
11
<?php
    list($year,$month,$day= get_today();
    print $year.'년'.$month.'월'.$day.'일';
 
    function get_today(){
        $year = date('Y');
        $month = date('m');
        $day = data('d');
        return array($year,$month,$day);
    }
?>
cs

오늘 날짜를 돌려주는 get_today 함수를 작성하고 list 함수를 이용해 배열의 값을 배열의 순서대로 여러 개의 변수에 할당할 수 있다. 그 반대의 기능은 array 함수가 있고, get_today 함수의 반환 값(return)으로 년, 월, 일의 3개의 변수를 array 함수로 배열에 넣어 반환 하게 만드는 것이다.

전역 변수

자바스크립트의 스코프(Scope)개념과 같다. 함수 내부에 있는 변수는 유효 범위, 즉 스코프(Scope)가 정해져 있어서 이 범위 밖에서는 조작을 할 수 없다. 따라서 함수 안에서 함수 밖의 변수를 참조하려면 전역으로 선언 해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
    $data = 5;
 
    function scope_test1(){
        $data = 1;
        print $data;
        print "<br>";
    }
    print $data;
    print "<br>";
    scope_test1();
    print $data;
    print "<br>";
?>
cs

전역 선언은 전역 선언을 사용하고 싶은 변수 앞에 global을 적는 것으로 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
    $data = 5;
    
    function scope_test3(){
        $GLOBALS['data'+= 1;
        print $GLOBALS['data'];
        print "<br>";
    }
    print $data;
    print "<br>";
    scope_test3();
    print $data;
    print "<br>";
?>
cs

다른 방법으로는 $GLOBALS를 사용하는 방법이다. 이것은 슈퍼 글로벌(Super globals)라고 부르는데, 효과는 이전에 global과 같지만 슈퍼 글로벌인 $GLOBALS는 어디서든지 사용할 수 있는 특징이 있다.

변수 의미
$GLOBALS 전역 변수
$_SERVER 서버 변수
$_ENV 환경 변수
$_COOKIE HTTP 쿠기
$_GET HTTP GET 변수
$_POST HTTP POST 변수
$_FILES HTTP 파일 업로드 변수
$_REQUEST HTTP Request 변수
$_SESSION Session 변수

위의 표는 PHP에서 사용할 수 있는 슈퍼 글로벌 변수들이다. 모두 연관 배열로 사용한다. $_SERVER와 $_ENV는 시스템에 따라 다른 값이 할당이 되고, $_GET과 $_POST는 송신 폼으로부터 값을 받는다. $_FILES는 업로드된 파일과 이름이 할당이 되고, $_SESSION은 데이터를 가지고 다니기 위해 사용되는 변수이다.

함수 안에 변수를 그대로 두고 전역 변수처럼 사용하려면 ststic을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    counter();
    counter();
    counter();
    counter();
    counter();
 
    function counter(){
        static $data = 0;
        print $data ++;
        print "<br>";
    }
?>
cs

위의 코드에서 ststic을 사용하지 않으면 함수안의 $data가 초기화가 되기 때문에 0을 5번 출력을 하게 되는데, $data를 static으로 선언하면 counter();를 호출 할 때마다 1씩 더하여 표시가 된다.