R's Hacking Daily Log

php 변수 다루기 (2) 본문

PHP

php 변수 다루기 (2)

hanhxx 2023. 6. 29. 21:28

Step 1 :: 지역 변수 [ local variable ]

변수는 어디서 선언되었느냐! 에 따라 사용할 수 있는 범위가 달라진다.

첫 번째로 알아볼 지역변수는 이름에서 알 수 있듯이 특정 지역에 한해서 유효한 변수를 얘기한다.

 

간단한 예시로 들자면 함수처럼 괄호로 묶인 범위 내에서 선언된 변수가 이에 해당한다.

<?php
function myFunc() {
    $str = "php";
    echo "변수 str의 값은 {$str}";
}

myFunc();
echo "변수 str의 값은 {$str}";
?>

 

위의 코드를 보면 str 변수가 myFunc 함수 안에서 만들어질 걸 볼 수 있다.

 

myFunc 함수 안에서 실행된 echo는 정상적으로 결과가 출력되지만

함수 밖에서 참조된 8번 째줄에서는 에러가 발생하게 된다. 

 

 

 

 


Step 2 :: 전역 변수 [ global variable ]

두 번째로 살펴볼 변수는 전역 변수이다.

지역 변수와 달리 함수 내에서 선언된 변수가 아닌 함수 외부에서 선언된 변수를 얘기한다.

함수 외부에서 만들어졌기 때문에 함수 안에서는 전역 변수를 참조할 수 없다!

 

<?php
$str2 = "php";
function myFunc2() {
    echo "<p>변수 str2의 값은 : {$str2} </p>";
}

myFunc2();
echo "<p>변수 str2의 값은 : {$str2} </p>";
?>

이번에는 str2라는 변수가 함수 외부에서 선언된 것을 볼 수 있다.

 

앞에서 말했듯이 전역 변수는 함수 내부에서 참조할 수 없기 때문에 myFunc2 함수에서 참조한 str2 변수는 

정상적으로 출력되지 않는다. 

 

대신 함수가 아닌 php 태그 내에서 참조한 8번 째줄에서는 정상적으로 str2 값이 출력된다. 

 

 

 

그. 런. 데!

만약 전역 변수를 함수 내부에서 사용하고자 할 때는 어떻게 할 수 있을까?

 

전역 변수로 선언한 변수 앞에 global keyword를 붙이면 함수 내부에서도 전역 변수에 접근이 가능해진다.

<?php
$str3 = 'PhP';
function myFunc3() {
    global $str3;
    echo "<p>변수 str3의 값은 : {$str3} </p>";
}

myFunc3();
echo "<p>변수 str3의 값은 : {$str3} </p>";

str3 변수를 전역 변수로 선언한 상태에서 myFunc3 함수에서는 global keyword를 사용했다.

 

이렇게 되면 함수 내부에서는 global로 전역 변수에 접근했기 때문에 str3 값을 출력할 수 있게 되고

함수 외부에 작성된 echo에서도 문제없이 전역 변수 str3 값을 출력할 수 있다. 

 

 

또는!

php에서는 전역으로 선언된 변수를 자동으로 $GLOBALS라는 배열에 저장하기 때문에 

배열의 인덱스로 변수명을 넣어 사용하고자 하는 전역 변수의 값을 얻을 수 있다.

 

<?php
function myFunc4() {
    echo "<p>변수 str2의 값은 : {$GLOBALS['str2']} </p>";
    echo "<p>변수 str3의 값은 : {$GLOBALS['str3']} </p>";
}

myFunc4();

앞선 코드에서 미리 선언한 str2 & str3 변수 값을 출력하는 코드이다.

$GLOBALS 배열에 변수명 str2 & str3을 넣으면 각 변수의 값으로 치환된다고 생각하면 된다. 

 

{$GLOBALS['str2']} = "php"
{$GLOBALS['str3']} = "PhP"

따라서 위의 코드를 실행해 보면 아래와 같이 결과가 나올 것이다.

 

 

 


Step 3 :: 정적 변수 [ static variable ]

마지막으로 살펴볼 정적변수이다.

정적 변수를 만들기 위해서는 변수 이름 앞에 static keyword를 붙여주면 끝이다.

 

정적 변수의 특징이 하나 있다면 함수가 반복적으로 선언되어 변수 값이 참조될 때,

각 함수 실행에 대해서 변숫값이 초기화되지 않는다는 것이다.

 

설명을 이해하기 위해 코드 예시를 살펴보자.

<?php
function myFunc5() {
    static $x = 0;
    echo "<p>변수 x의 값은 : {$x}</p>";
    $x++;
}

myFunc5();
myFunc5();
myFunc5();
myFunc5();

이 php 코드에는 myFunc5 함수가 만들어져 있고 총 4번 함수가 호출된다.

함수 내부에서는 static 변수 x가 초기값 0을 갖고 있으며 x의 현재 값을 출력한 후, 1 증가하는 형태의 내용이 실행된다. 

 

만약 x변수가 정적 변수가 아닌 일반 지역 변수라면 함수가 실행될 때마다 x에는 당연히 0이 들어가니까

모든 함수 호출의 결과는 0이 출력될 것이다.

 

하지만 정적 변수로 만들어진 x는 조금 다르다.

언급한 바와 같이 정적 변수는 함수가 실행될 때마다 변숫값이 초기화되지 않기 때문에 이전 함수 실행의

결과가 그대로 이어지게 된다. 

 

 

1 x = 0 echo 실행 x = 1
2 x = 1 echo 실행 x = 2
3 x = 2 echo 실행 x = 3
4 x = 3 echo 실행 x = 4

처음 myFunc5 함수가 실행되면 x = 0인 상태에서 echo가 실행되고 나서 +1 되기 때문에 x가 1을 저장한 상태로 

첫 함수 실행이 끝나게 된다.

 

두 번째로 myFunc5 함수가 실행되면 x = 1인 상태에서 echo가 실행되고 +1. [x = 2]

세 번째 myFunc5 함수가 실행되고 x = 2인 상태에서 echo 실행, +1. [x = 3]

네 번째 myFunc5 함수가 실행되고 x = 3인 상태에서 echo 실행, +1. [x = 4]

 

그렇기 때문에 함수가 모든 실행되고 나면 x는 4라는 값을 가지게 되지만 출력되는 값은 [0, 1, 2, 3]이 된다.

 

 

x가 증가된 후의 값도 확인하고 싶어서 echo를 맨 마지막에 추가해서 실행해보면

마지막 값이 4인 걸 확인할 수 있다!

'PHP' 카테고리의 다른 글

php 연산자 다루기 (2)  (0) 2023.07.02
php 연산자 다루기 (1)  (1) 2023.07.01
php 데이터 타입  (0) 2023.06.30
php 상수 다루기  (0) 2023.06.30
php 변수 다루기 (1)  (0) 2023.06.29
Comments