티스토리 뷰
내 질문:
php에서 전역변수, 지역변수 이런 변수의 종류가 있는 것 같은데,
이러한 변수의 종류들을 알기 쉽게 설명하면서 예시도 보여줘.
PHP에서 변수는 어디에서 선언되었는지와 어디까지 사용할 수 있는지에 따라 종류가 나뉩니다.
가장 중요한 개념은 바로 범위(scope) 입니다.
쉽게 말하면:
- “이 변수는 어디에서 살아있나?”
- “어디에서 접근 가능한가?”
를 구분하는 거예요.
대표적으로 아래 종류를 많이 사용합니다.
1. 지역 변수 (Local Variable)
가장 기본적인 변수입니다.
함수 안에서 만든 변수는 그 함수 안에서만 사용 가능합니다.
예제
<?php
function test() {
$name = "수지";
echo $name;
}
test();
실행 결과
수지
그런데 함수 밖에서는?
<?php
function test() {
$name = "수지";
}
test();
echo $name;
결과
오류 발생 (Undefined variable)
왜냐하면 $name은 함수 안에서만 살아있는 지역 변수이기 때문입니다.
2. 전역 변수 (Global Variable)
함수 밖에서 만든 변수입니다.
프로그램 전체에서 존재하지만,
함수 안에서는 그냥 바로 사용할 수 없습니다.
예제
<?php
$age = 20;
function test() {
echo $age;
}
test();
결과
오류 발생
함수는 자기 내부 변수만 기본적으로 보기 때문입니다.
global 키워드 사용
함수 안에서 전역변수를 쓰려면 global을 붙입니다.
<?php
$age = 20;
function test() {
global $age;
echo $age;
}
test();
결과
20
3. static 변수
함수 안에서 선언되지만,
함수가 끝나도 값이 사라지지 않는 변수입니다.
처음 배우면 가장 신기한 변수입니다.
일반 지역 변수
<?php
function countNum() {
$num = 0;
$num++;
echo $num . "<br>";
}
countNum();
countNum();
countNum();
결과
1
1
1
함수가 끝날 때마다 $num이 사라지기 때문입니다.
static 변수 사용
<?php
function countNum() {
static $num = 0;
$num++;
echo $num . "<br>";
}
countNum();
countNum();
countNum();
결과
1
2
3
static은 값을 기억합니다.
4. 매개변수(Parameter) 변수
함수에 값을 전달받는 변수입니다.
예제
<?php
function hello($name) {
echo "안녕하세요 " . $name;
}
hello("수지");
결과
안녕하세요 수지
$name은 함수 안에서만 사용하는 지역 변수이면서,
외부 값을 전달받는 특별한 변수입니다.
5. 슈퍼 전역 변수 (Super Global Variable)
PHP에서 특별하게 제공하는 전역 변수입니다.
어디서든 바로 사용 가능합니다.
대표적인 것들:
| $_GET | GET 방식 데이터 |
| $_POST | POST 방식 데이터 |
| $_SESSION | 세션 데이터 |
| $_COOKIE | 쿠키 데이터 |
| $_SERVER | 서버 정보 |
예제 ($_GET)
주소:
test.php?name=suji
PHP:
<?php
echo $_GET['name'];
결과
suji
한눈에 정리
| 지역 변수 | 함수 내부 | 함수 내부만 |
| 전역 변수 | 함수 외부 | 전체 (함수 안은 global 필요) |
| static 변수 | 함수 내부 | 값 유지 |
| 매개변수 변수 | 함수 괄호 안 | 함수 내부 |
| 슈퍼 전역 변수 | PHP 제공 | 어디서든 가능 |
가장 중요한 핵심
초보자가 꼭 기억해야 하는 건 딱 이것입니다.
함수 안 변수 ≠ 함수 밖 변수
function a() {
$x = 10;
}
여기서 $x는 함수 밖에서는 존재하지 않습니다.
실무에서 많이 쓰는 패턴
전역 세션 사용
사용자의 SNS 프로젝트에서도 이런 코드 많이 씁니다.
$_SESSION['loginid']
이건 슈퍼 전역 변수라서 어디서든 사용 가능합니다.
예:
<?php
session_start();
echo $_SESSION['loginid'];
비유로 이해하기
- 지역 변수 → 내 방 서랍
- 전역 변수 → 집 거실
- static 변수 → 잠금 보관함 (계속 기억)
- 매개변수 → 택배로 전달받은 물건
- 슈퍼 전역 변수 → 건물 전체 공용시설
내 질문:
왜 실무에서 global을 잘 안 쓰는데?
실무에서 global을 잘 안 쓰는 이유는 단순합니다.
코드가 점점 복잡해질수록 관리가 매우 어려워지기 때문입니다.
처음에는 편해 보이는데, 프로젝트가 커질수록 버그의 원인이 됩니다.
먼저 global의 동작부터 다시 보기
<?php
$name = "수지";
function test() {
global $name;
echo $name;
}
test();
함수 밖 변수 $name을 함수 안으로 끌어와서 사용하는 방식입니다.
얼핏 보면 편해 보임
왜냐면:
- 어디서든 접근 가능
- 값 공유 쉬움
- 코드 짧음
그래서 초보자 때는 많이 씁니다.
그런데 실무에서는 문제가 커짐
1. 누가 값을 바꾸는지 추적하기 어려움
가장 큰 문제입니다.
예제
<?php
$count = 0;
function plus() {
global $count;
$count++;
}
function minus() {
global $count;
$count--;
}
plus();
plus();
minus();
echo $count;
결과:
1
문제는 프로젝트가 커지면:
- 어떤 함수가 값을 바꿨는지
- 어디서 수정됐는지
- 왜 값이 이상해졌는지
추적이 매우 어려워집니다.
실무에서는 이런 일이 생김
$user = "admin";
갑자기 다른 파일에서:
global $user;
$user = null;
그러면 로그인 문제가 생김.
근데 어디서 바뀌었는지 찾기 힘듦.
2. 함수의 독립성이 사라짐
좋은 함수는:
입력값 → 처리 → 결과
가 명확해야 합니다.
좋은 함수
function add($a, $b) {
return $a + $b;
}
이 함수는:
- 외부 영향 없음
- 테스트 쉬움
- 재사용 쉬움
global 사용하는 함수
$total = 0;
function add() {
global $total;
$total += 10;
}
이 함수는:
- 외부 변수에 의존
- 함수만 봐서는 동작 이해 어려움
- 테스트 어려움
3. 유지보수가 힘들어짐
실무 프로젝트는:
- 파일 수백 개
- 함수 수천 개
- 개발자 여러 명
입니다.
global 남발하면:
global $db;
global $user;
global $config;
global $token;
이렇게 되는데,
어떤 값이 어디서 바뀌는지 파악이 어려워집니다.
4. 버그가 숨겨짐
global은 “몰래 연결된 코드”를 만듭니다.
예를 들어:
function savePost() {
global $db;
}
함수만 보면 $db가 어디서 오는지 모름.
즉:
- 숨겨진 의존성(hidden dependency)
- 코드 가독성 하락
- 디버깅 어려움
문제가 생깁니다.
실무에서는 어떻게 하냐?
보통은:
1. 매개변수(parameter) 사용
function test($name) {
echo $name;
}
test("수지");
명확합니다.
2. 클래스 사용 (객체지향)
class User {
public $name = "수지";
}
필요한 데이터만 객체로 관리합니다.
3. 의존성 주입(DI)
현대 PHP 프레임워크(Laravel 등)는 거의 이 방식입니다.
function __construct(Database $db)
필요한 객체를 직접 전달받습니다.
그런데 global을 완전히 안 쓰는 건 아님
아주 제한적으로 씁니다.
대표적인 예외
1. $GLOBALS
PHP 내부 관리용
2. 설정값(config)
$config['db_host']
3. 레거시 프로젝트
옛날 PHP 코드에는 global 엄청 많음.
특히:
- PHP 5 시대
- 오래된 쇼핑몰
- 오래된 게시판
네 SNS 프로젝트 기준으로 보면
예를 들어 이런 건 괜찮음:
$_SESSION['loginid']
왜냐하면:
- PHP 공식 슈퍼 전역 변수
- 로그인 상태 관리용
- 실무에서도 매우 흔함
하지만 이런 건 별로임:
global $loginUser;
보다는:
function writePost($loginUser)
이렇게 전달하는 게 더 좋습니다.
한 줄 핵심
global은 “편하지만 위험한 지름길”
작은 프로젝트에서는 괜찮아 보이지만,
프로젝트가 커질수록:
- 디버깅 어려움
- 유지보수 어려움
- 협업 어려움
때문에 실무에서는 최대한 줄입니다.
그리고 이걸 이해하면 나중에:
- 객체지향(OOP)
- Laravel
- Spring
- React 상태관리
- 의존성 주입(DI)
같은 개념들이 훨씬 잘 이해되기 시작합니다.
By. ChatGPT
'몸부림의 흔적' 카테고리의 다른 글
| # UX와 UI에 대해서 - 이해하기 쉽게 알아보기 (+ React/Vue, API 개념까지) (1) | 2026.05.18 |
|---|---|
| # PHP와 HTML의 관계 (+ 자바스크립트 & 스위치의 관계에 대해서. 왜 URL로 정보를 주고 받아야 하는지.) (0) | 2026.05.14 |
| # PHP문법 응용하여 문제 풀기 - 학교와 학년 선택해서 제어 후 값 출력하기 (0) | 2026.05.12 |
| # 내PC 서버와 웹 호스팅 서버의 차이 / 네이버나 구글 웹사이트는 어떻게 서버를 구축하나 / 도메인 연결 의미 (1) | 2026.05.11 |
| # PHP 서버 환경 구축할 때 핵심 개념 & PHP의 역할 및 대체 가능한 다른 옵션들에 대해서 (feat. 웹 개발 요즘 트랜드) (1) | 2026.05.09 |
- Total
- Today
- Yesterday
- cost let var 비교
- 컴포즈 커피
- 클래스랑 구조체 차이
- 로즈마리
- php
- php문법
- $stmt
- 컴파일러와 인터프리터 차이
- 파충류 동반자
- 구조체 개념 이해하기 쉽게
- 톰 더 글로우 시그니처
- CRUD
- 호이스팅 개념
- 자바스크립트 주요 키워드
- 컴파일러 언어
- JavaScript
- SQL 개념
- 로즈마리 물꽂이
- 컴파일러 인터프리터 비교
- sql 핵심 개념
- php 개념
- 에어프라이어 청소
- PHP 문법
- 구조체와 배열의 차이
- 나무 같은 사람이 되고 싶다
- 클래스 개념
- 국제운전면허증 발급
- sql 문법
- 프리지아
- 은구비공원
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
