반응형
Web Development · PHP Local Variable
지역 변수의 함정 —
매번 호출마다 0으로 초기화
"카운터"를 만들려고 했는데 항상 0만 나오는 이유
시작 오늘 분석할 코드
함수를 5번 호출하면서 "몇 번째 호출인지" 카운터를 만들려는 코드. 하지만 의도와 달리 매번 0만 출력된다. 그 이유를 짚어보고, 다음 글(static2)에서 어떻게 해결하는지 비교하기 위한 빌드업.
<?php counter(); counter(); counter(); counter(); counter(); function counter(){ $data = 0; print $data ++; print "<BR>"; } ?>
실제 출력 결과
0
0
0
0
0
0
0
0
0
5번 호출했지만 0만 5번 출력. 카운터가 누적되지 않는다.
용어 용어 정리
지역 변수함수 안에서 선언된 변수
초기화변수에 처음 값을 대입하는 것
$data = 0함수 호출마다 다시 0으로 시작
$data++후위 증가 — 사용 후 +1
함수 호출함수 코드를 실행하는 동작
생명주기변수가 만들어져서 소멸할 때까지의 기간
소멸 (스택 정리)함수 종료 시 지역 변수가 메모리에서 사라짐
의도 vs 실제"누적 카운터" 의도, "매번 0" 실제
1 무엇이 잘못됐나?
코드를 의도대로 읽으면 "0, 1, 2, 3, 4"가 나올 것 같다. 5번 호출하면서 매번 +1 하니까. 하지만 결과는 모두 0.
※ 함정의 정체: 매 호출마다 함수가 새로 시작되고, 그때마다 $data = 0이 다시 실행된다. 직전 호출의 $data는 함수 종료 때 이미 사라졌다.
2 지역 변수의 생명주기
함수 안의 변수는 함수 시작에 태어나고 함수 끝에 죽는다. 다음 호출 때 같은 이름으로 변수를 만들면 그건 완전히 새로 만든 변수다.
함수 호출 ───→ $data 메모리 할당 → $data = 0 → ++ → print │ │ └──────────────── 함수 종료 시 $data 소멸 ◄──────────────┘ ▼ 다시 호출 → 새 $data → 0 → ...
매 호출은 "백지에서 시작"이라 보면 된다. 이전 호출의 흔적은 남지 않는다.
3 후위 증가 ($data++) 의 동작
print $data++; // ↑ ↑ // 1) 현재 값을 출력 // 2) 그 다음에 1 증가
$data++ (후위)
사용 후 증가
print 0 → 그 다음 $data = 1
(but 함수 끝나면 사라짐)
print 0 → 그 다음 $data = 1
(but 함수 끝나면 사라짐)
++$data (전위)
증가 후 사용
$data = 1 → print 1
이번 코드에선 결과 다름
$data = 1 → print 1
이번 코드에선 결과 다름
이 코드는 $data++를 쓰니 화면에는 0이 나오고, 함수 안에서는 곧 1이 되지만, 함수가 끝나면 그 1은 사라진다.
반응형
4 5번 호출 단계별 추적
1
1번째 counter() 호출$data 새로 생성 → 0 → print 0 → $data=1 → 함수 종료(소멸)
2
2번째 counter() 호출이전 $data 흔적 없음 → 새 $data = 0 → print 0 → 소멸
3
3번째또 새로 시작 → 0 출력
4
4번째또 새로 시작 → 0 출력
5
5번째또 새로 시작 → 0 출력
5 같은 함수가 5번 다 새로 태어난다
이 점이 PHP의 함수가 "순수"한 이유다 — 외부 상태에 영향받지 않고 매번 같은 결과를 낸다. 같은 입력에 같은 출력. 안전한 동작이지만, "기억"이 필요한 경우엔 불리하다.
"기억"이 필요한 경우
· 함수가 몇 번 호출됐는지 세기
· 이전 결과를 캐시해서 재계산 피하기
· 호출마다 다른 ID 부여 (1번 사용자, 2번 사용자, …)
· 함수가 몇 번 호출됐는지 세기
· 이전 결과를 캐시해서 재계산 피하기
· 호출마다 다른 ID 부여 (1번 사용자, 2번 사용자, …)
6 해결책 — 누적 메모리가 필요하다
| 방법 | 장점 | 단점 |
|---|---|---|
| 전역 변수 + global | 간단 | 외부 노출, 디버깅 어려움 |
| $GLOBALS 직접 접근 | 선언 줄 안 늘림 | 매번 길어짐 |
static $data |
함수 내부에 격리, 누적 가능 | 없음 (이 경우 가장 적합) |
| 매개변수로 받고 return | 가장 깔끔 | 호출 측이 관리해야 함 |
| 객체 (클래스 속성) | 객체지향에 적합 | 준비 비용 |
이 코드의 의도엔 static이 가장 잘 맞는다. 다음 글(static2)에서 한 줄 차이로 결과가 어떻게 바뀌는지 본다.
7 미리 보기 — static을 붙이면
function counter() { static $data = 0; // 한 줄만 바뀜! print $data++; print "<BR>"; } // 결과: 0, 1, 2, 3, 4 ✓
static이 붙으면 $data가 처음 호출 때 한 번만 0으로 초기화되고, 이후 호출에서는 이전 값을 기억한다.
8 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 지역 변수가 누적될 거라 기대 | 매번 초기값으로 리셋 | static 또는 외부 저장소 사용 |
| $data++ vs ++$data 헷갈림 | 출력 값이 1 어긋남 | 출력 시점 ↔ 증가 시점 명확히 |
| print $data++; print $data; | 0 출력 후 같은 호출 안에선 1 출력 | 함수 안 동작과 호출 간 동작 분리해서 생각 |
| "카운터"인데 5번 다 같은 값 | 구조적 문제 (이 코드) | static 추가 |
| 전역으로 빼서 해결 | 동작은 되지만 결합도↑ | static이 더 깔끔 |
9 의의 — "함수가 무엇을 기억하느냐"의 문제
이 코드의 의의는 "PHP 함수의 기본은 무기억(stateless)"이라는 사실을 명확히 보여주는 데 있다. 외부에서 보면 같은 함수를 5번 호출했지만, 함수 내부에는 호출 사이의 연결고리가 전혀 없다.
상태(state)를 가지려면 의식적 선언이 필요하다 — static, global, 객체의 속성, 외부 저장소 등. 그 첫 단계가
static이다.핵심 한 줄 요약
지역 변수함수 시작에 생성, 끝에 소멸
$data = 0매 호출마다 다시 실행 → 카운터 누적 안 됨
출력 0,0,0,0,05번 호출 모두 백지에서 시작
$data++사용 후 증가 — 함수 안에서만 잠깐 1
statelessPHP 함수의 기본 — 호출 사이 기억 없음
해결static / global / 매개변수 / 객체 등으로 상태 보존
다음 글static을 붙여 한 줄로 해결 (static2 참고)
반응형
'php' 카테고리의 다른 글
| PHP addslashes — 따옴표 이스케이프 완전 정리 (0) | 2026.06.14 |
|---|---|
| PHP static 변수 — 호출 사이에 값을 기억시키는 누적 카운터 완전 정리 (0) | 2026.06.14 |
| PHP $GLOBALS 슈퍼글로벌 배열 — 전역 변수 직접 접근 완전 정리 (0) | 2026.06.14 |
| PHP global 키워드 — 함수 안에서 전역변수 공유 완전 정리 (1) | 2026.06.14 |
| PHP 변수 스코프 — 지역/전역 분리 완전 정리 (0) | 2026.06.13 |
왕진 블로그

댓글