본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP $GLOBALS 슈퍼글로벌 배열 — 전역 변수 직접 접근 완전 정리

by 왕진 2026. 6. 14.
반응형

 

 

Web Development · PHP $GLOBALS

$GLOBALS 슈퍼글로벌 —
키 이름으로 전역 변수에 직접 접근

global 키워드 없이 $GLOBALS['data']로 같은 일을 하는 방법
시작 오늘 분석할 코드

global2.php와 결과는 같지만 방법이 다른 코드. global $data; 선언 대신 $GLOBALS['data']라는 특수 배열을 통해 직접 전역 변수에 접근한다.

<?php // 전역 변수 $data = 5; function scope_test(){ // 전역 변수를 참조 $GLOBALS['data'] += 1; print $GLOBALS['data']; print "<BR>"; } print $data; print "<BR>"; scope_test(); print $data; print "<BR>"; ?>
실제 출력 결과
5
6
6

global2와 똑같이 5 / 6 / 6. 결과는 같지만 접근 방식이 다르다.

용어 용어 정리
$GLOBALSPHP가 자동 제공하는 슈퍼글로벌 배열
슈퍼글로벌스코프 무관 어디서나 접근 가능한 특수 변수
$GLOBALS['x']전역 변수 $x를 가리키는 배열 항목
키 이름$ 없이 변수 이름만 (data → 'data')
읽기 + 쓰기$GLOBALS['x'] = 값 으로 전역 변경 가능
+=자기 자신에 더해서 대입하는 복합 연산자
선언 불필요global 키워드처럼 미리 선언할 필요 없음
vs global결과 같음, 가독성·간결함이 다름

1 $GLOBALS는 무엇인가?

PHP가 시작될 때 자동으로 만들어주는 특수 배열이다. 모든 전역 변수가 이 배열의 키로 들어가 있다.

$data = 5; $user = "kim"; // 이렇게 하면 자동으로 ↓ $GLOBALS['data'] === 5 $GLOBALS['user'] === "kim"

즉 전역 스코프에 변수를 만들면 $GLOBALS 배열에도 자동 등록된다. 함수 안에서 $GLOBALS['data']를 통해 직접 그 칸을 읽거나 쓸 수 있다.

"슈퍼글로벌"이라는 이름은 스코프 제약을 받지 않는다는 뜻. 함수 안에서도 global 선언 없이 바로 접근 가능.

2 다른 슈퍼글로벌 배열들

$GLOBALS는 여러 슈퍼글로벌 중 하나다. 모두 함수 안에서 선언 없이 사용 가능.

슈퍼글로벌 역할
$GLOBALS 모든 전역 변수에 접근
$_GET URL 쿼리스트링 (?a=1&b=2)
$_POST POST 요청 본문 (폼 전송)
$_REQUEST $_GET + $_POST + $_COOKIE
$_SESSION 세션 저장소
$_COOKIE 쿠키 데이터
$_FILES 업로드된 파일 정보
$_SERVER 서버·요청 정보
$_ENV 환경 변수

3 키는 $ 없이
$data = 5; ← 변수 이름은 "data" $GLOBALS['data'] ← 키도 'data' ($ 없음!)
잘못된 표기
$GLOBALS['$data']
키에 $ 붙이면 못 찾음
"$data"라는 이름의 변수는 없음
올바른 표기
$GLOBALS['data']
$ 없이 이름만
전역 $data를 정확히 가리킴

 

반응형

 

4 global vs $GLOBALS — 둘은 어떻게 다른가
global 키워드
함수 첫 줄에 global $data;
그 후 $data를 보통 변수처럼 사용
가독성↑ — 어떤 변수를 끌어왔는지 한 눈에
$GLOBALS 배열
선언 없이 $GLOBALS['data']
키 이름만 정확히 알면 됨
간결함↑ — 줄 추가 안 해도 됨
관점 global $GLOBALS
함수 시작 시 선언 필요 (1줄 추가) 불필요
변수처럼 짧게 사용 가능 ($data) 매번 $GLOBALS['data']
"무얼 끌어왔나" 한눈 잘 보임 본문 다 봐야 알 수 있음
여러 번 쓸 때 유리 매번 길어짐
한두 번만 쓸 때 줄 추가가 부담 간결

5 실행 흐름 단계별 추적
1
$data = 5전역 $data 생성, $GLOBALS['data']도 자동으로 5
2
함수 정의실행은 아직 안 함
3
print $data; → 5
4
scope_test() 호출함수 진입
5
$GLOBALS['data'] += 1전역 $data를 직접 5 + 1 = 6으로 변경
6
print $GLOBALS['data']; → 6
7
함수 종료변경된 6은 그대로 남음
8
print $data; → 6전역 $data를 다시 출력

6 $GLOBALS만의 장점
※ $GLOBALS가 더 유리한 경우
  • 변수 이름을 동적으로 결정해야 할 때 ($GLOBALS[$key])
  • 함수 안에서 한두 번만 전역 변수를 만질 때
  • 전역 변수의 존재 여부를 검사할 때 (isset($GLOBALS['x']))
  • 모든 전역 변수를 반복 처리해야 할 때 (foreach($GLOBALS as ...))

7 자주 하는 실수
실수 증상 해결
키에 $ 붙임 — $GLOBALS['$data'] 그런 변수 없어서 null 키는 $ 없이 이름만
지역 변수도 $GLOBALS에 있을 거라 기대 지역 변수는 $GLOBALS에 없음 $GLOBALS는 전역만 담음
$GLOBALS를 함수에 매개변수로 넘김 의미 없음 (이미 어디서나 보임) 그냥 직접 사용
$GLOBALS 변경 후 원본 안 바뀐다고 생각 실제로는 같은 메모리 → 바뀜 $GLOBALS는 진짜 전역과 동기화
대형 프로젝트에서 $GLOBALS 남발 어디서 변경되는지 추적 어려움 가능하면 매개변수 + return

8 한 단계 발전 — 권장은 매개변수+return

global이든 $GLOBALS든 모두 "함수가 외부 상태를 직접 건드린다"는 점은 같다. 현대 PHP에서는 둘 다 피하는 게 권장된다.

// 권장: 매개변수와 반환값 $data = 5; function scope_test($x) { return $x + 1; } $data = scope_test($data); print $data; // 6
함수가 어떤 외부 변수에 영향을 주는지 호출 코드 한 줄만 봐도 알 수 있다 → 디버깅 유리.

핵심 한 줄 요약

$GLOBALSPHP가 자동 제공하는 슈퍼글로벌 배열
접근$GLOBALS['이름'] — $ 없이 이름만 키로
선언 불필요global 키워드처럼 미리 선언 안 해도 됨
결과global과 동일 → 5 / 6 / 6
vs global선언 줄이 줄지만 매 사용에 길어짐
장점동적 변수명, 일회성 접근, 반복 처리에 유리
권장현대식은 매개변수 + return을 더 선호
반응형

댓글