티스토리 뷰

 

내 질문:

php에서 전역변수, 지역변수 이런 변수의 종류가 있는 것 같은데,

이러한 변수의 종류들을 알기 쉽게 설명하면서 예시도 보여줘.

 

 

PHP에서 변수는 어디에서 선언되었는지어디까지 사용할 수 있는지에 따라 종류가 나뉩니다.
가장 중요한 개념은 바로 범위(scope) 입니다.

쉽게 말하면:

  • “이 변수는 어디에서 살아있나?”
  • “어디에서 접근 가능한가?”

를 구분하는 거예요.

대표적으로 아래 종류를 많이 사용합니다.


1. 지역 변수 (Local Variable)

가장 기본적인 변수입니다.

함수 안에서 만든 변수는 그 함수 안에서만 사용 가능합니다.

예제

 
<?php

function test() {
    $name = "수지";
    echo $name;
}

test();
 

실행 결과

수지
 

그런데 함수 밖에서는?

 
<?php

function test() {
    $name = "수지";
}

test();

echo $name;
 

결과

오류 발생 (Undefined variable)
 

왜냐하면 $name은 함수 안에서만 살아있는 지역 변수이기 때문입니다.


2. 전역 변수 (Global Variable)

함수 밖에서 만든 변수입니다.

프로그램 전체에서 존재하지만,
함수 안에서는 그냥 바로 사용할 수 없습니다.

예제

 
<?php

$age = 20;

function test() {
    echo $age;
}

test();
 

결과

오류 발생
 

함수는 자기 내부 변수만 기본적으로 보기 때문입니다.


global 키워드 사용

함수 안에서 전역변수를 쓰려면 global을 붙입니다.

 
<?php

$age = 20;

function test() {
    global $age;
    echo $age;
}

test();
 

결과

20
 

3. static 변수

함수 안에서 선언되지만,
함수가 끝나도 값이 사라지지 않는 변수입니다.

처음 배우면 가장 신기한 변수입니다.


일반 지역 변수

 
<?php

function countNum() {
    $num = 0;
    $num++;

    echo $num . "<br>";
}

countNum();
countNum();
countNum();
 

결과

1
1
1
 

함수가 끝날 때마다 $num이 사라지기 때문입니다.


static 변수 사용

 
<?php

function countNum() {
    static $num = 0;

    $num++;

    echo $num . "<br>";
}

countNum();
countNum();
countNum();
 

결과

1
2
3
 

static은 값을 기억합니다.


4. 매개변수(Parameter) 변수

함수에 값을 전달받는 변수입니다.

예제

 
<?php

function hello($name) {
    echo "안녕하세요 " . $name;
}

hello("수지");
 

결과

안녕하세요 수지
 

$name은 함수 안에서만 사용하는 지역 변수이면서,
외부 값을 전달받는 특별한 변수입니다.


5. 슈퍼 전역 변수 (Super Global Variable)

PHP에서 특별하게 제공하는 전역 변수입니다.

어디서든 바로 사용 가능합니다.

대표적인 것들:

                                        변수                                                                                     의미
$_GET GET 방식 데이터
$_POST POST 방식 데이터
$_SESSION 세션 데이터
$_COOKIE 쿠키 데이터
$_SERVER 서버 정보

예제 ($_GET)

주소:

test.php?name=suji
 

PHP:

 
<?php

echo $_GET['name'];
 

결과

suji
 

한눈에 정리

                      종류                                       선언 위치                                             사용 가능 범위
지역 변수 함수 내부 함수 내부만
전역 변수 함수 외부 전체 (함수 안은 global 필요)
static 변수 함수 내부 값 유지
매개변수 변수 함수 괄호 안 함수 내부
슈퍼 전역 변수 PHP 제공 어디서든 가능

가장 중요한 핵심

초보자가 꼭 기억해야 하는 건 딱 이것입니다.

함수 안 변수 ≠ 함수 밖 변수

 
function a() {
    $x = 10;
}
 

여기서 $x는 함수 밖에서는 존재하지 않습니다.


실무에서 많이 쓰는 패턴

전역 세션 사용

사용자의 SNS 프로젝트에서도 이런 코드 많이 씁니다.

 
$_SESSION['loginid']
 

이건 슈퍼 전역 변수라서 어디서든 사용 가능합니다.

예:

 
<?php
session_start();

echo $_SESSION['loginid'];
 

비유로 이해하기

  • 지역 변수 → 내 방 서랍
  • 전역 변수 → 집 거실
  • static 변수 → 잠금 보관함 (계속 기억)
  • 매개변수 → 택배로 전달받은 물건
  • 슈퍼 전역 변수 → 건물 전체 공용시설

 


 

내 질문:

왜 실무에서 global을 잘 안 쓰는데?

 

 

실무에서 global을 잘 안 쓰는 이유는 단순합니다.

코드가 점점 복잡해질수록 관리가 매우 어려워지기 때문입니다.

처음에는 편해 보이는데, 프로젝트가 커질수록 버그의 원인이 됩니다.


먼저 global의 동작부터 다시 보기

 
<?php

$name = "수지";

function test() {
    global $name;

    echo $name;
}

test();
 

함수 밖 변수 $name을 함수 안으로 끌어와서 사용하는 방식입니다.


얼핏 보면 편해 보임

왜냐면:

  • 어디서든 접근 가능
  • 값 공유 쉬움
  • 코드 짧음

그래서 초보자 때는 많이 씁니다.


그런데 실무에서는 문제가 커짐


1. 누가 값을 바꾸는지 추적하기 어려움

가장 큰 문제입니다.

예제

 
<?php

$count = 0;

function plus() {
    global $count;
    $count++;
}

function minus() {
    global $count;
    $count--;
}

plus();
plus();
minus();

echo $count;
 

결과:

1
 

문제는 프로젝트가 커지면:

  • 어떤 함수가 값을 바꿨는지
  • 어디서 수정됐는지
  • 왜 값이 이상해졌는지

추적이 매우 어려워집니다.


실무에서는 이런 일이 생김

 
$user = "admin";
 

갑자기 다른 파일에서:

 
global $user;
$user = null;
 

그러면 로그인 문제가 생김.

근데 어디서 바뀌었는지 찾기 힘듦.


2. 함수의 독립성이 사라짐

좋은 함수는:

입력값 → 처리 → 결과

가 명확해야 합니다.


좋은 함수

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

이 함수는:

  • 외부 영향 없음
  • 테스트 쉬움
  • 재사용 쉬움

global 사용하는 함수

 
$total = 0;

function add() {
    global $total;
    $total += 10;
}
 

이 함수는:

  • 외부 변수에 의존
  • 함수만 봐서는 동작 이해 어려움
  • 테스트 어려움

3. 유지보수가 힘들어짐

실무 프로젝트는:

  • 파일 수백 개
  • 함수 수천 개
  • 개발자 여러 명

입니다.


global 남발하면:

 
global $db;
global $user;
global $config;
global $token;
 

이렇게 되는데,

어떤 값이 어디서 바뀌는지 파악이 어려워집니다.


4. 버그가 숨겨짐

global은 “몰래 연결된 코드”를 만듭니다.

예를 들어:

 
function savePost() {
    global $db;
}
 

함수만 보면 $db가 어디서 오는지 모름.

즉:

  • 숨겨진 의존성(hidden dependency)
  • 코드 가독성 하락
  • 디버깅 어려움

문제가 생깁니다.


실무에서는 어떻게 하냐?

보통은:

1. 매개변수(parameter) 사용

 
function test($name) {
    echo $name;
}

test("수지");
 

명확합니다.


2. 클래스 사용 (객체지향)

 
class User {
    public $name = "수지";
}
 

필요한 데이터만 객체로 관리합니다.


3. 의존성 주입(DI)

현대 PHP 프레임워크(Laravel 등)는 거의 이 방식입니다.

 
function __construct(Database $db)
 

필요한 객체를 직접 전달받습니다.


그런데 global을 완전히 안 쓰는 건 아님

아주 제한적으로 씁니다.


대표적인 예외

1. $GLOBALS

PHP 내부 관리용


2. 설정값(config)

 
$config['db_host']
 

3. 레거시 프로젝트

옛날 PHP 코드에는 global 엄청 많음.

특히:

  • PHP 5 시대
  • 오래된 쇼핑몰
  • 오래된 게시판

네 SNS 프로젝트 기준으로 보면

예를 들어 이런 건 괜찮음:

 
$_SESSION['loginid']
 

왜냐하면:

  • PHP 공식 슈퍼 전역 변수
  • 로그인 상태 관리용
  • 실무에서도 매우 흔함

하지만 이런 건 별로임:

 
global $loginUser;
 

보다는:

 
function writePost($loginUser)
 

이렇게 전달하는 게 더 좋습니다.


한 줄 핵심

global은 “편하지만 위험한 지름길”

작은 프로젝트에서는 괜찮아 보이지만,

프로젝트가 커질수록:

  • 디버깅 어려움
  • 유지보수 어려움
  • 협업 어려움

때문에 실무에서는 최대한 줄입니다.


그리고 이걸 이해하면 나중에:

  • 객체지향(OOP)
  • Laravel
  • Spring
  • React 상태관리
  • 의존성 주입(DI)

같은 개념들이 훨씬 잘 이해되기 시작합니다.

 

 

By. ChatGPT