1. 지역 변수(Local Variable): 함수라는 나만의 개인실
지역 변수는 특정 함수 내부라는 '개인실'에서만 선언되고 사용되는 변수입니다. 이 방 안에서 일어나는 일은 외부에서 전혀 알 수 없습니다.
 특징: 함수 내부에서 선언되며, 함수 밖에서는 절대로 접근할 수 없습니다.
 생명주기(Lifecycle): 함수가 실행될 때 메모리의 스택(Stack) 영역에 생성되었다가, 함수 실행이 종료되는 즉시 메모리에서 사라집니다. 방을 나가는 순간 불을 끄고 짐을 다 비우는 것과 같습니다.
function showLocal() {
    $y = 20; // 로컬 변수: 이 방 안의 개인 물품
    echo $y; // 출력: 20
}

showLocal();
// echo $y; // ❌ 오류: 외부에서는 이 방의 주인인 $y를 찾을 수 없습니다.
이렇게 지역 변수를 사용하면 이름이 겹치더라도 서로 영향을 주지 않는 '이름 충돌 방지' 효과가 있어, 함수 단위로 데이터를 안전하게 관리할 수 있습니다.
--------------------------------------------------------------------------------
2. 전역 변수(Global Variable): 스크립트 전체의 공용 광장
전역 변수는 함수 외부에서 선언되어 스크립트 전체에서 유효한 변수입니다. 마을 사람들이 모두 함께 사용하는 '공용 광장'과 같죠.
 특징: 함수 외부에서 선언되며 기본적으로 스크립트 어디서든 접근 가능합니다.
 PHP의 독특한 보안 절차: 자바스크립트 등 다른 언어와 달리, PHP는 함수(개인실) 내부에서 외부 전역 변수를 쓸 때 "지금부터 광장에 있는 물건을 쓰겠다"는 보안 게이트 통과(global 키워드) 절차가 반드시 필요합니다.
⚠️ 시니어의 경고: "우물에 독 풀기"를 조심하세요
전역 변수는 **가변성(Mutability)**을 가집니다. 특정 함수 내부에서 전역 변수 값을 수정하면, 광장에 있는 그 물건 자체가 바뀌어 버립니다. 이는 다른 함수들이 예상치 못한 값을 읽게 만드는 '부작용(Side Effects)'을 초래하며, 프로그램 전체를 오염시키는 위험한 행위가 될 수 있습니다.
--------------------------------------------------------------------------------
3. 전역과 지역을 잇는 통로: global 키워드와 $GLOBALS
함수 안에서 광장의 변수를 안전하게 가져다 쓰는 방법은 두 가지입니다.
방법 1: global 키워드
함수 내에서 global $var;를 선언하여 외부 변수와 연결합니다.
$total = 3000; // 전역 변수

function num_plus($a, $b) {
    global $total; // "광장에 있는 $total을 가져오겠다"는 패스포트 체크
    return $a + $b + $total;
}

echo "합계: " . num_plus(1000, 2000); // 출력: 6000
⚠️ 주의: global $y = 100; 처럼 선언과 동시에 값을 할당하면 오류가 발생합니다. global은 외부와 연결하는 통로를 만드는 역할만 할 뿐, 새로운 물건을 광장에 배치하면서 동시에 값을 정할 수는 없기 때문입니다. 값 할당은 반드시 다음 줄에서 진행하세요.
방법 2: $GLOBALS 연관 배열
PHP는 모든 전역 변수를 $GLOBALS라는 **연관 배열(Associative Array)**에 담아 관리합니다. 변수 이름이 '키(Key)'가 됩니다.
$name = "홍길동";

function showName() {
    // $GLOBALS['변수명'] 형태로 직접 접근
    echo $GLOBALS['name']; // 출력: 홍길동
}
--------------------------------------------------------------------------------
4. 특별한 거주자: 정적 변수(Static Variable)
정적 변수는 겉보기엔 지역 변수 같지만, 함수가 끝나도 자기의 값을 잊지 않는 '놀라운 기억력'을 가진 거주자입니다.
 특징: 함수 내부에 선언되지만, PHP는 이를 함수 실행 컨텍스트 외부의 **별도 정적 저장소(Static Storage Area)**에 보관합니다. 덕분에 함수가 종료되어 방이 비워져도 값은 유지됩니다.
function counter() {
    static $count = 0; // 정적 변수: 초기화는 딱 한 번만 수행됨
    $count++;
    echo "호출 횟수: $count<br>";
}

counter(); // 호출 횟수: 1
counter(); // 호출 횟수: 2 (기존 값을 재사용)
--------------------------------------------------------------------------------
5. 어디서나 통하는 만능 패스: 슈퍼글로벌(Superglobals)
PHP에는 별도의 global 선언 없이도 어디서든 즉시 접근 가능한 9가지 만능 변수가 있습니다.

변수명주요 용도설명

$_SERVER
서버 및 실행 환경 정보
서버 경로, 헤더, 스크립트 위치 등의 정보를 담은 연관 배열
$_GET
URL 파라미터 데이터
URL(?id=1)을 통해 전달된 데이터. PHP가 자동 디코딩함
$_POST
HTTP POST 데이터
HTML 양식(form)의 body를 통해 제출된 민감한 데이터
$_FILES
업로드 파일 정보
파일명, 크기, 타입, 임시 경로 등 업로드 파일의 메타데이터
$_SESSION
서버 측 상태 유지
로그인 정보 등 서버에 저장된 세션 데이터 관리
$_COOKIE
클라이언트 쿠키 정보
브라우저에 저장된 쿠키 값을 확인하거나 설정
$_REQUEST
통합 요청 데이터
$_GET, $_POST, $_COOKIE의 내용을 모두 포함한 패키지
$_ENV
환경 변수 정보
운영체제나 서버 환경에서 설정된 변수 (API 키 등)
$GLOBALS
전역 변수 참조 배열
현재 스크립트에 선언된 모든 전역 변수에 접근 가능
--------------------------------------------------------------------------------
6. 현대적 변수 확장: 클로저(Closure)와 use 키워드
익명 함수(Closure)를 사용할 때는 use 키워드로 외부 변수를 안으로 들여올 수 있습니다. 이때 중요한 점은 use가 함수가 정의되는 시점의 값을 바인딩(Binding)한다는 것입니다.
$strString = "hello";

// use를 사용하여 정의 시점의 외부 변수 상태를 기억
$fnClosure = function() use ($strString) {
    echo $strString;
};

$strString = "bye"; // 정의 이후에 값을 바꿔도
$fnClosure(); // 출력: hello (정의 당시의 'hello'를 기억함)
--------------------------------------------------------------------------------
7. 안전한 동네 만들기: 왜 전역 변수를 피해야 할까?
실무에서 시니어 개발자들이 전역 변수 사용을 극구 말리는 이유는 명확합니다.
1. 이름 충돌(Namespace Collision): 규모가 커지면 어디서 같은 이름을 썼는지 파악하기 힘듭니다.
2. 테스트 가능성 저하: 전역 변수에 의존하는 코드는 외부 상태에 따라 결과가 달라져서 독립적인 테스트가 불가능합니다.
3. 추적 불가능한 side effect: 어떤 함수가 "우물(전역 변수)"에 독을 탔는지 찾느라 밤을 새우게 됩니다.
💡 대안: 의존성 주입(Dependency Injection, DI)
전역 변수를 쓰는 대신, 필요한 데이터를 함수의 **인자(Parameter)**로 넘겨주세요. 특히 객체 지향 프로그래밍에서는 **의존성 주입(DI)**을 통해 '느슨한 결합'을 만드는 것이 핵심입니다. 예를 들어, 서비스 클래스가 직접 DB 객체를 생성하는 게 아니라 외부에서 주입받으면, 나중에 '실제 DB' 대신 '테스트용 가짜 DB'로 갈아 끼우기가 매우 쉬워집니다.
--------------------------------------------------------------------------------
8. 마무리: 요약 및 체크리스트
코딩을 시작하기 전, 내 변수가 어디에 살아야 할지 다시 한번 체크해 보세요.
  지역 변수: 스택 메모리에 사는 개인실 거주자. 함수 종료 시 즉시 삭제.
  전역 변수: 광장에 사는 공용 자산. 함수 내 사용 시 global 선언 필수. (남용 금지!)
  정적 변수: 함수 내에 있지만 별도 정적 저장소에 살아남아 값을 기억함.
  슈퍼글로벌: 대문자로 표기된 9가지 프리패스. 어디서든 즉시 접근 가능.

+ Recent posts