반응형
Web Development · PHP Variable Scope
PHP 변수 스코프 —
같은 이름이라도 안과 밖은 다른 변수
함수 안의 $data와 함수 바깥의 $data는 별개
시작 오늘 분석할 코드
전역에 선언된 $data = 5와 함수 안의 $data = 1이 이름은 같지만 별개의 변수임을 보여주는 코드. PHP의 엄격한 스코프 규칙을 가장 명확히 드러내는 예제다.
<?php // 전역 변수 $data = 5; function scope_test(){ // 지역 변수를 참조 $data = 1; print $data; print "<BR>"; } print $data; print "<BR>"; scope_test(); print $data; print "<BR>"; ?>
실제 출력 결과
5
1
5
1
5
마지막에 5가 다시 나오는 게 핵심. 함수 안에서 $data = 1을 했지만, 함수 바깥의 $data는 그대로 5를 유지한다.
용어 용어 정리
스코프 (scope)변수가 살아있는 유효 범위
전역 변수함수 바깥에서 선언된 변수
지역 변수함수 안에서 선언된 변수
$data (전역)5로 시작, 함수 호출 후에도 5
$data (지역)함수 호출 시 1로 새로 만들어짐
동명이변수이름은 같지만 스코프가 달라 별개
스코프 격리PHP 함수는 바깥 변수를 자동 인식 안 함
생성/소멸지역 변수는 함수 시작에 생성, 끝에 소멸
1 다른 언어와 다른 PHP의 특이점
자바스크립트·파이썬에 익숙한 사람이 PHP에서 자주 헷갈리는 점이다. 두 언어는 함수 안에서 바깥 변수를 자동으로 읽을 수 있다. 하지만 PHP는 그렇지 않다.
자바스크립트 / 파이썬
함수 안에서 바깥 변수 자동 인식
→ 바깥의 x를 읽음 (closure)
function f() { console.log(x); }→ 바깥의 x를 읽음 (closure)
PHP
함수 안은 격리된 스코프
→ undefined 경고
function f() { echo $x; }→ undefined 경고
※ PHP 함수 안에서 바깥 변수에 접근하려면 매개변수로 넘기거나 global 선언을 해야 한다 (다음 글 global2 참고).
2 같은 이름의 두 변수
이 코드의 핵심은 $data라는 이름이 두 번 등장한다는 점이다.
$data = 5; ← 전역 스코프의 $data (이름표 A) function scope_test() { $data = 1; ← 함수 스코프의 $data (이름표 B, 완전히 별개) print $data; }
이름표 A와 B는 메모리에서 전혀 다른 두 개의 칸이다. 단지 우리 눈에는 이름이 같아 보일 뿐.
PHP에게 함수 안의
$data는 "방금 처음 본 변수"다. 함수 바깥의 $data = 5는 함수에게 보이지 않는다.3 실행 흐름 단계별 추적
1
$data = 5전역 변수 생성: $data = 5
2
function scope_test() { ... }함수 정의만 등록 (실행은 아직)
3
print $data;전역 $data 출력 → "5"
4
scope_test() 호출함수 안으로 진입 → 새로운 지역 스코프 시작
5
$data = 1 (지역)함수 안에 새 지역 변수 $data 생성, 1 대입
6
print $data;지역 $data 출력 → "1"
7
함수 종료지역 $data 소멸 (메모리에서 사라짐)
8
print $data;전역 $data는 그대로 5 → "5"
반응형
4 왜 PHP는 이렇게 엄격한가?
※ 스코프 격리의 장점
- 함수가 외부 상태에 의존하지 않음 → 예측 가능성↑
- 같은 이름 변수를 여러 함수에서 안전하게 재사용 가능
- 함수의 사이드 이펙트(부작용) 방지
- 대규모 프로젝트에서 변수 충돌 사고 차단
"함수는 입력만 받아서 결과만 내야 한다"는 함수형 프로그래밍 철학에 가깝다. 외부 변수에 마음대로 접근하면 코드가 어디서 무엇을 바꾸는지 추적이 어려워진다.
5 함수 안의 지역 변수는 함수가 끝나면 사라진다
function scope_test() { $data = 1; ← 함수 시작 시 메모리에 생성 print $data; } ← 함수 끝 → $data 소멸 print $data; ← 함수 안 $data는 이미 사라짐 (전역 $data가 출력될 뿐)
매번 scope_test()를 부를 때마다 함수 안의 $data는 다시 새로 만들어지고, 끝나면 다시 사라진다. 누적되지 않는다 (이게 누적되게 하려면 static을 써야 함 → static1/2 글 참고).
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 함수 안에서 바깥 변수 그냥 사용 | undefined 경고, null로 처리 | 매개변수로 넘기거나 global 선언 |
| 같은 이름이라 같은 변수로 착각 | 의도한 값과 다른 결과 | 스코프 분리 인지, 가능하면 이름 분리 |
| 지역 변수가 다음 호출에서도 살아있을 거라 기대 | 매번 0/null로 초기화됨 | 누적이 필요하면 static 사용 |
| 함수 안에서 정의한 변수를 바깥에서 사용 | undefined 경고 | return으로 돌려받기 |
| 전역 오남용 | 코드 결합도↑, 디버깅 어려움 | 가능하면 매개변수와 반환값으로 |
7 권장 — 매개변수와 반환값으로 다루기
전역 변수에 의존하는 함수는 "이 함수가 무엇에 영향받는지 외부에서 알 수 없다"는 단점이 있다. 권장 패턴은 입력은 매개변수로, 출력은 return으로.
전역 의존 (피하기)
$data = 5;
function f() {
global $data;
$data = 10;
}외부 상태 직접 변경
매개변수+반환 (권장)
$data = 5;
function f($x) {
return $x + 5;
}
$data = f($data);입력·출력 명시적
핵심 한 줄 요약
스코프변수가 보이는 유효 범위
전역함수 바깥 — 함수 안에서는 자동으로 안 보임
지역함수 안 — 함수 시작에 생성, 끝에 소멸
동명이변수이름이 같아도 스코프가 다르면 별개
출력 5/1/5함수 안 변경이 바깥에 영향 없음을 입증
JS/Python과 차이PHP는 클로저 자동 안 됨 — 명시적 처리 필요
권장전역보다 매개변수 + return 패턴
반응형
'php' 카테고리의 다른 글
| PHP $GLOBALS 슈퍼글로벌 배열 — 전역 변수 직접 접근 완전 정리 (0) | 2026.06.14 |
|---|---|
| PHP global 키워드 — 함수 안에서 전역변수 공유 완전 정리 (1) | 2026.06.14 |
| PHP return + list — 배열 반환과 다중 변수 분해 완전 정리 (0) | 2026.06.13 |
| PHP return — 함수 결과 돌려주기 + strlen 바이트 검사 완전 정리 (0) | 2026.06.13 |
| PHP 사용자 정의 함수 — 매개변수 없는 함수 완전 정리 (0) | 2026.06.13 |
왕진 블로그

댓글