반응형
Web Development · PHP global keyword
PHP global 키워드 —
함수 안에서 바깥 변수에 접근하기
$data를 함수 안과 바깥에서 공유 → 함수 호출이 원본 값을 직접 변경
시작 오늘 분석할 코드
앞서 본 global1.php와 거의 똑같지만 한 줄이 다르다 — 함수 첫 줄에 global $data;가 있다. 그 한 줄로 함수 안의 $data가 바깥의 그것과 같은 변수가 된다.
<?php // 전역 변수 $data = 5; function scope_test(){ global $data; // 전역 변수를 참조 $data += 1; print $data; print "<BR>"; } print $data; print "<BR>"; scope_test(); print $data; print "<BR>"; ?>
실제 출력 결과
5
6
6
6
6
마지막에도 6이 나온다. 함수 안에서 +1 한 게 바깥 $data에 그대로 영향을 준 것.
용어 용어 정리
global함수 안에서 같은 이름의 전역 변수를 끌어오는 키워드
전역 변수 공유global 선언 시 안과 밖이 같은 메모리 주소
+=$x = $x + 값을 짧게 쓰는 복합 연산자
$data전역 5에서 함수 호출 후 6으로 변경
사이드 이펙트함수가 외부 상태를 변경하는 효과
참조 (reference)같은 메모리 칸을 가리키는 별칭
global 위치함수 본문 첫 줄에 적는 게 관례
vs $GLOBALSglobal 키워드와 다른 또 하나의 방법 (global3 참고)
1 global이 없으면? — global1과의 차이
global1 (global 없음)
함수 안 $data는 새 지역 변수
바깥 $data와 무관
결과: 5 / 1 / 5
바깥 $data와 무관
결과: 5 / 1 / 5
global2 (이 코드)
함수 안 $data = 바깥 $data
같은 메모리 칸을 공유
결과: 5 / 6 / 6
같은 메모리 칸을 공유
결과: 5 / 6 / 6
즉
global $data; 한 줄을 더하면 함수가 바깥 변수를 진짜로 변경할 수 있게 된다.2 global 키워드의 의미
function scope_test() { global $data; // ↑ ↑ // 키워드 "이 함수에서 $data는 전역의 그것과 같은 변수다" }
global은 "이 변수는 새로 만들지 말고, 바깥의 같은 이름 변수를 그대로 가져와 쓰라"는 선언이다.
| 함수 안 작업 | global 없을 때 | global 있을 때 |
|---|---|---|
$data = 100; |
지역 $data 새로 만듦 | 전역 $data를 100으로 변경 |
print $data; |
지역 $data (정의 안 됐으면 경고) | 전역 $data 출력 |
$data += 1; |
지역 $data 1로 (null+1) | 전역 $data 1 증가 |
| 함수 종료 후 | 지역 $data 소멸 | 전역 $data는 변경된 채로 남음 |
3 += 복합 대입 연산자
$data += 1; // 같다 → $data = $data + 1;
| 연산자 | 의미 | 풀어 쓰면 |
|---|---|---|
+= |
더해서 자기에 대입 | $x = $x + n |
-= |
빼서 대입 | $x = $x - n |
*= |
곱해서 대입 | $x = $x * n |
/= |
나눠서 대입 | $x = $x / n |
.= |
문자열 결합 후 대입 | $s = $s . "추가" |
++ |
1 증가 | $x = $x + 1 |
반응형
4 실행 흐름 단계별 추적
1
$data = 5전역에 $data = 5
2
함수 정의실행은 아직 안 함
3
print $data; → 5 출력
4
scope_test() 호출함수 진입
5
global $data;함수 안 $data ↔ 바깥 $data 같은 변수로 연결
6
$data += 1; → 5 + 1 = 6전역 $data가 6으로 변경됨
7
print $data; → 6 출력
8
함수 종료전역 $data는 6 그대로 유지
9
print $data; → 6 출력함수가 변경한 값이 그대로 보임
5 여러 변수를 한꺼번에
function f() { global $a, $b, $c; // 콤마로 여러 변수 $a += $b + $c; }
또는 줄바꿈해서 명시적으로:
global $a;
global $b;
global $c;6 global의 단점 — 왜 권장되지 않는가
※
global은 PHP에서 가능하지만 권장되지 않는 패턴이다. 가능한 한 매개변수와 반환값으로 처리하는 게 좋다.※ global 사용의 단점
- 함수가 외부 상태에 의존 → 테스트 어려움
- 같은 이름 전역 변수가 여기저기서 변경 → 디버깅 지옥
- 함수 시그니처(매개변수 목록)만 보고는 영향 범위를 알 수 없음
- 대규모 프로젝트에서 변수 충돌 사고 빈발
- 객체지향 코드에서는 클래스 속성으로 대체
7 권장 대안 — 매개변수 + return
global 사용 (이 코드)
$data = 5;
function f() {
global $data;
$data += 1;
}
f();
print $data; // 6매개변수 + return
$data = 5;
function f($x) {
return $x + 1;
}
$data = f($data);
print $data; // 6같은 결과지만 두 번째 방식은 "함수가 무엇을 받아 무엇을 내는지"가 함수 시그니처에 모두 드러난다. 외부 변수에 함수 내부에서 접근하지 않으므로 사이드 이펙트도 없다.
8 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
global $data; 빼먹음 |
함수가 새 지역 변수 만듦 | 전역 접근 시 반드시 global 선언 |
| global을 함수 외부에 적음 | 의미 없음 (오류는 아님) | 함수 본문 안에 적기 |
| 전역 변수 이름 충돌 | 다른 곳의 같은 이름이 덮임 | 이름 prefix 또는 클래스 속성 사용 |
| 여러 함수에서 global 남발 | 코드 흐름 추적 어려움 | 의존성 주입(매개변수)로 리팩토링 |
| +=의 좌·우 헷갈림 | 의도와 다른 결과 | $x += 1 은 $x = $x+1 |
핵심 한 줄 요약
global $x;함수 안에서 같은 이름의 전역 변수를 끌어오기
효과함수 안 $x ↔ 바깥 $x 같은 메모리 칸 공유
출력 5/6/6함수의 +1이 바깥에 그대로 영향
+=자기 자신에 더해서 다시 대입하는 복합 연산자
한꺼번에global $a, $b, $c; 식으로 여러 개 가능
단점사이드 이펙트, 디버깅 어려움 → 가능하면 회피
권장매개변수로 받고 return으로 돌려주기
반응형
'php' 카테고리의 다른 글
| PHP 지역 변수 — static 없을 때의 함정 완전 정리 (0) | 2026.06.14 |
|---|---|
| PHP $GLOBALS 슈퍼글로벌 배열 — 전역 변수 직접 접근 완전 정리 (0) | 2026.06.14 |
| PHP 변수 스코프 — 지역/전역 분리 완전 정리 (0) | 2026.06.13 |
| PHP return + list — 배열 반환과 다중 변수 분해 완전 정리 (0) | 2026.06.13 |
| PHP return — 함수 결과 돌려주기 + strlen 바이트 검사 완전 정리 (0) | 2026.06.13 |
왕진 블로그

댓글