본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP 지역 변수 — static 없을 때의 함정 완전 정리

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

 

 

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

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 함수 끝나면 사라짐)
++$data (전위)
증가 후 사용
$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번 사용자, …)

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 참고)
반응형

댓글