반응형
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
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을 더 선호
반응형
'php' 카테고리의 다른 글
| PHP static 변수 — 호출 사이에 값을 기억시키는 누적 카운터 완전 정리 (0) | 2026.06.14 |
|---|---|
| PHP 지역 변수 — static 없을 때의 함정 완전 정리 (0) | 2026.06.14 |
| PHP global 키워드 — 함수 안에서 전역변수 공유 완전 정리 (1) | 2026.06.14 |
| PHP 변수 스코프 — 지역/전역 분리 완전 정리 (0) | 2026.06.13 |
| PHP return + list — 배열 반환과 다중 변수 분해 완전 정리 (0) | 2026.06.13 |
왕진 블로그

댓글