본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP 변수 스코프 — 지역/전역 분리 완전 정리

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

 

 

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

마지막에 5가 다시 나오는 게 핵심. 함수 안에서 $data = 1을 했지만, 함수 바깥의 $data는 그대로 5를 유지한다.

용어 용어 정리
스코프 (scope)변수가 살아있는 유효 범위
전역 변수함수 바깥에서 선언된 변수
지역 변수함수 안에서 선언된 변수
$data (전역)5로 시작, 함수 호출 후에도 5
$data (지역)함수 호출 시 1로 새로 만들어짐
동명이변수이름은 같지만 스코프가 달라 별개
스코프 격리PHP 함수는 바깥 변수를 자동 인식 안 함
생성/소멸지역 변수는 함수 시작에 생성, 끝에 소멸

1 다른 언어와 다른 PHP의 특이점

자바스크립트·파이썬에 익숙한 사람이 PHP에서 자주 헷갈리는 점이다. 두 언어는 함수 안에서 바깥 변수를 자동으로 읽을 수 있다. 하지만 PHP는 그렇지 않다.

자바스크립트 / 파이썬
함수 안에서 바깥 변수 자동 인식
function f() { console.log(x); }
→ 바깥의 x를 읽음 (closure)
PHP
함수 안은 격리된 스코프
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 패턴
반응형

댓글