
1. 도입: PHP 상수란 무엇인가?
**상수(Constant)**는 프로그램 실행 중 그 값이 절대 변하지 않는 고정된 식별자입니다. 데이터를 직접 코드에 작성하는 '하드코딩' 대신 의미 있는 이름을 부여하여 사용하는 '데이터의 별칭'입니다. 변수($)와 달리 상수는 한 번 선언되면 재할당이 불가능하며, 프로그램 전체에서 공유되는 불변의 값으로 존재합니다.
상수를 사용하면 다음과 같은 이점이 있습니다.
• 가독성 향상: 의미 없는 숫자나 문자열에 이름을 부여하여 코드의 의도를 명확히 합니다.
• 유지보수성 증대: 전역 설정값을 한 곳에서 관리하여 변경 시 전체 코드를 수정할 필요가 없습니다.
• 안정성 확보: 실수로 값을 변경하는 상황을 언어 차원에서 차단합니다.
--------------------------------------------------------------------------------
2. 상수를 선언하는 두 가지 방법: define()과 const
PHP에서 상수를 정의하는 방법은 define() 함수와 const 키워드 두 가지가 있습니다.
2.1 define() 함수
define('NAME', value); 형태로 사용하며, PHP 4부터 지원된 전통적인 방식입니다. 함수이기 때문에 프로그램이 실행되는 런타임(Runtime) 시점에 상수가 정의됩니다.
<?php
define('DB_HOST', 'localhost');
define('MAX_LOGIN_ATTEMPTS', 5);
2.2 const 키워드
const NAME = value; 형태로 사용하며, PHP 5.3 이후 전역 범위에서도 사용 가능해졌습니다. const는 **언어 구조(Language Construct)**로 분류되며, 클래스 내부에서 상수를 정의할 때 사용하는 표준적인 방식입니다.
<?php
const APP_VERSION = '1.0.0';
class Member {
const MAX_AGE = 20;
}
--------------------------------------------------------------------------------
3. 핵심 비교: define() vs const, 무엇이 다른가?
두 방식은 기술적 작동 원리와 유효 범위에서 명확한 차이가 있습니다. 특히 네임스페이스(Namespace) 처리 방식과 처리 시기를 이해하는 것이 중요합니다.
비교 항목define() 함수const 키워드
|
처리 시기
|
런타임 (실행 시 정의)
|
컴파일 타임 (실행 전 정의)
|
|
네임스페이스
|
전역에 선언 (이름에 경로 포함 필요)
|
현재 네임스페이스에 자동 소속
|
|
조건부 선언
|
가능 (if 문 내에서 사용 가능)
|
불가 (항상 최상위 스코프 필요)
|
|
클래스 내부
|
선언 불가
|
선언 가능
|
|
유연성
|
상수명에 표현식 사용 가능
|
고정된 식별자만 가능
|
|
표현식 지원
|
모든 표현식 지원
|
PHP 5.6부터 스칼라 표현식 지원
|
|
대소문자 구분
|
PHP 8.0부터 구분만 지원 (선택 불가)
|
항상 구분함
|
네임스페이스 동작 차이: const는 선언된 위치의 네임스페이스를 따르지만, define()은 기본적으로 전역(Global)에 선언됩니다. 네임스페이스 내에서 define()을 사용하려면 define(__NAMESPACE__ . '\\NAME', value);와 같이 이름을 직접 지정해야 합니다.
--------------------------------------------------------------------------------
4. 배열 상수와 상수 표현식 (PHP 7.0+ 이후 변화)
현대 PHP 환경에서는 상수의 활용 범위가 더욱 넓어졌습니다.
• 배열 상수(Array Constants): PHP 7.0부터 define()에서도 배열 상수를 지원합니다. (const는 PHP 5.6부터 지원) 상수로 선언된 배열은 **읽기 전용(Read-only)**이며, 요소를 수정하려고 시도하면 **치명적 오류(Fatal Error)**가 발생합니다.
• 상수 표현식: PHP 5.6부터 const에서도 단순한 값뿐만 아니라 비트 연산이나 산술 연산 등의 스칼라 표현식을 사용할 수 있게 되어 유연성이 향상되었습니다.
<?php
// PHP 7.0+ 배열 상수
define('ALLOWED_EXTENSIONS', ['jpg', 'png', 'gif']);
// PHP 5.6+ 상수 표현식
const BIT_MASK = 1 << 5;
--------------------------------------------------------------------------------
5. 마법 상수(Magic Constants)와 예약된 상수
PHP는 코드의 위치나 환경 정보를 제공하는 특수한 상수를 제공합니다. 특히 마법 상수는 언더스코어 두 개(__)로 시작하며, 선언된 위치에 따라 값이 동적으로 변합니다.
주요 마법 상수 리스트
• __LINE__: 파일 내의 현재 줄 번호
• __FILE__: 파일의 전체 경로와 파일명
• __DIR__: 파일이 위치한 디렉터리 경로
• __FUNCTION__: 현재 함수 이름
• __CLASS__: 현재 클래스 이름
• __TRAIT__: 현재 트레이트(Trait) 이름 (네임스페이스 포함)
• __NAMESPACE__: 현재 네임스페이스 이름
시스템 예약 상수
• PHP_VERSION: 현재 서버의 PHP 버전
• PHP_OS: PHP가 실행 중인 운영체제(OS) 이름
--------------------------------------------------------------------------------
6. 실무 베스트 프랙티스 및 주의사항
6.1 명명 규칙 및 존재 확인
상수는 반드시 UPPER_CASE와 언더스코어(_)를 사용하는 관례를 따르십시오. 또한 상수의 중복 선언을 방지하기 위해 defined() 함수를 활용하는 것이 좋습니다.
<?php
if (!defined('API_KEY')) {
define('API_KEY', 'default_secret');
}
6.2 보안과 엄격한 비교 (Strict Comparison)
상수를 비교할 때는 반드시 **엄격한 비교(===)**를 사용해야 합니다. PHP의 느슨한 비교(==)는 보안 취약점을 야기할 수 있습니다.
<?php
// 보안 취약점 예시
$password = true; // 사용자 입력이 불리언으로 조작된 경우
if ($password == 'admin_password') {
// '문자열' == true는 참(true)이 되어 인증이 뚫릴 수 있음
echo "인증 성공 (위험!)";
}
// 안전한 비교
if ($password === 'admin_password') {
echo "인증 성공";
}
6.3 클래스 상수와 추상화 기법
클래스 내부 상수는 $this->가 아닌 self:: 또는 static::을 통해 접근합니다. 또한 자식 클래스에서 특정 상수를 반드시 정의하도록 강제하고 싶다면 아래와 같은 구조를 활용할 수 있습니다.
https://api.example.com';
}
--------------------------------------------------------------------------------
7. 결론: 어떤 상황에서 무엇을 써야 할까?
성능 벤치마크 결과에 따르면 const와 define()의 실행 속도 차이는 미미하며, 두 방식 모두 getEnv()를 통한 환경 변수 접근보다 월등히 빠릅니다. 따라서 성능보다는 코드의 구조와 목적에 따라 선택해야 합니다.
• 가급적 const를 사용하십시오.
◦ 가독성이 뛰어나고 언어 구조상 정적 분석 도구(Static Analysis Tool)의 지원을 받기 유리합니다.
◦ 네임스페이스를 명확히 준수하며 클래스 상수를 정의할 때 필수적입니다.
• 특수한 경우에만 define()을 사용하십시오.
◦ if 문 등을 활용한 조건부 선언이 필요한 경우.
◦ 상수 이름을 동적으로 생성해야 하는 경우.
◦ 네임스페이스와 상관없이 전역 스코프에 상수를 강제 등록해야 하는 경우.
상수를 올바르게 사용하는 습관은 단순한 값의 고정을 넘어, 거대한 프로젝트의 데이터 무결성과 보안을 지키는 가장 기본적이고 강력한 방법입니다.# 절대 변하지 않는 값: PHP 상수의 선언과 활용 (define vs const)
PHP 개발에서 상수는 프로그램의 생명 주기 동안 변경되지 않는 고정된 값을 관리하는 핵심 도구입니다. 코드의 가독성을 높이고 유지보수를 용이하게 하며, 의도치 않은 데이터 변경으로 인한 버그를 방지하는 **불변성(Immutability)**의 상징이기도 합니다. 본 포스트에서는 10년 차 시니어 개발자의 관점에서 PHP 상수의 기술적 메커니즘과 실무 베스트 프랙티스를 분석합니다.
--------------------------------------------------------------------------------
1. 도입: PHP 상수란 무엇인가?
**상수(Constant)**는 프로그램 실행 중 그 값이 절대 변하지 않는 고정된 식별자입니다. 데이터를 직접 코드에 작성하는 '하드코딩' 대신 의미 있는 이름을 부여하여 사용하는 '데이터의 별칭'입니다. 변수($)와 달리 상수는 한 번 선언되면 재할당이 불가능하며, 프로그램 전체에서 공유되는 불변의 값으로 존재합니다.
상수를 사용하면 다음과 같은 이점이 있습니다.
• 가독성 향상: 의미 없는 숫자나 문자열에 이름을 부여하여 코드의 의도를 명확히 합니다.
• 유지보수성 증대: 전역 설정값을 한 곳에서 관리하여 변경 시 전체 코드를 수정할 필요가 없습니다.
• 안정성 확보: 실수로 값을 변경하는 상황을 언어 차원에서 차단합니다.
--------------------------------------------------------------------------------
2. 상수를 선언하는 두 가지 방법: define()과 const
PHP에서 상수를 정의하는 방법은 define() 함수와 const 키워드 두 가지가 있습니다.
2.1 define() 함수
define('NAME', value); 형태로 사용하며, PHP 4부터 지원된 전통적인 방식입니다. 함수이기 때문에 프로그램이 실행되는 런타임(Runtime) 시점에 상수가 정의됩니다.
<?php
define('DB_HOST', 'localhost');
define('MAX_LOGIN_ATTEMPTS', 5);
2.2 const 키워드
const NAME = value; 형태로 사용하며, PHP 5.3 이후 전역 범위에서도 사용 가능해졌습니다. const는 **언어 구조(Language Construct)**로 분류되며, 클래스 내부에서 상수를 정의할 때 사용하는 표준적인 방식입니다.
<?php
const APP_VERSION = '1.0.0';
class Member {
const MAX_AGE = 20;
}
--------------------------------------------------------------------------------
3. 핵심 비교: define() vs const, 무엇이 다른가?
두 방식은 기술적 작동 원리와 유효 범위에서 명확한 차이가 있습니다. 특히 네임스페이스(Namespace) 처리 방식과 처리 시기를 이해하는 것이 중요합니다.
비교 항목define() 함수const 키워드
|
처리 시기
|
런타임 (실행 시 정의)
|
컴파일 타임 (실행 전 정의)
|
|
네임스페이스
|
전역에 선언 (이름에 경로 포함 필요)
|
현재 네임스페이스에 자동 소속
|
|
조건부 선언
|
가능 (if 문 내에서 사용 가능)
|
불가 (항상 최상위 스코프 필요)
|
|
클래스 내부
|
선언 불가
|
선언 가능
|
|
유연성
|
상수명에 표현식 사용 가능
|
고정된 식별자만 가능
|
|
표현식 지원
|
모든 표현식 지원
|
PHP 5.6부터 스칼라 표현식 지원
|
|
대소문자 구분
|
PHP 8.0부터 구분만 지원 (선택 불가)
|
항상 구분함
|
네임스페이스 동작 차이: const는 선언된 위치의 네임스페이스를 따르지만, define()은 기본적으로 전역(Global)에 선언됩니다. 네임스페이스 내에서 define()을 사용하려면 define(__NAMESPACE__ . '\\NAME', value);와 같이 이름을 직접 지정해야 합니다.
--------------------------------------------------------------------------------
4. 배열 상수와 상수 표현식 (PHP 7.0+ 이후 변화)
현대 PHP 환경에서는 상수의 활용 범위가 더욱 넓어졌습니다.
• 배열 상수(Array Constants): PHP 7.0부터 define()에서도 배열 상수를 지원합니다. (const는 PHP 5.6부터 지원) 상수로 선언된 배열은 **읽기 전용(Read-only)**이며, 요소를 수정하려고 시도하면 **치명적 오류(Fatal Error)**가 발생합니다.
• 상수 표현식: PHP 5.6부터 const에서도 단순한 값뿐만 아니라 비트 연산이나 산술 연산 등의 스칼라 표현식을 사용할 수 있게 되어 유연성이 향상되었습니다.
<?php
// PHP 7.0+ 배열 상수
define('ALLOWED_EXTENSIONS', ['jpg', 'png', 'gif']);
// PHP 5.6+ 상수 표현식
const BIT_MASK = 1 << 5;
--------------------------------------------------------------------------------
5. 마법 상수(Magic Constants)와 예약된 상수
PHP는 코드의 위치나 환경 정보를 제공하는 특수한 상수를 제공합니다. 특히 마법 상수는 언더스코어 두 개(__)로 시작하며, 선언된 위치에 따라 값이 동적으로 변합니다.
주요 마법 상수 리스트
• __LINE__: 파일 내의 현재 줄 번호
• __FILE__: 파일의 전체 경로와 파일명
• __DIR__: 파일이 위치한 디렉터리 경로
• __FUNCTION__: 현재 함수 이름
• __CLASS__: 현재 클래스 이름
• __METHOD__: 현재 클래스의 메서드 이름
• __TRAIT__: 현재 트레이트(Trait) 이름
• __NAMESPACE__: 현재 네임스페이스 이름
시스템 예약 상수
• PHP_VERSION: 현재 서버의 PHP 버전
• PHP_OS: PHP가 실행 중인 운영체제(OS) 이름
--------------------------------------------------------------------------------
6. 실무 베스트 프랙티스 및 주의사항
6.1 명명 규칙 및 존재 확인
상수는 반드시 UPPER_CASE와 언더스코어(_)를 사용하는 관례를 따르십시오. 또한 상수의 중복 선언을 방지하기 위해 defined() 함수를 활용하는 것이 좋습니다.
<?php
if (!defined('API_KEY')) {
define('API_KEY', 'default_secret');
}
6.2 보안과 엄격한 비교 (Strict Comparison)
상수를 비교할 때는 반드시 **엄격한 비교(===)**를 사용해야 합니다. PHP의 느슨한 비교(==)는 보안 취약점을 야기할 수 있습니다.
<?php
// 보안 취약점 예시 (Source: mytory)
$password = true; // 사용자 입력이 불리언으로 조작된 상황 가정
if ($password == 'admin') {
// PHP에서 '문자열' == true는 참(true)이 됨
echo "인증 성공 (위험: 보안 취약점)";
}
// 권장되는 안전한 비교
if ($password === 'admin') {
echo "인증 성공";
}
6.3 클래스 상수와 추상화 기법
클래스 내부 상수는 $this->가 아닌 self::를 통해 접근합니다. 또한 자식 클래스에서 특정 상수를 반드시 정의하도록 강제하고 싶다면 추상 클래스에서 상수를 null로 선언하고 예외를 던지는 구조를 활용할 수 있습니다.
https://api.example.com';
}
--------------------------------------------------------------------------------
7. 결론: 어떤 상황에서 무엇을 써야 할까?
성능 벤치마크 결과에 따르면 const와 define()의 실행 속도 차이는 미미하며, 두 방식 모두 getEnv()를 통한 환경 변수 접근보다 월등히 빠릅니다. 따라서 성능보다는 코드의 구조와 목적에 따라 선택해야 합니다.
• 가급적 const를 사용하십시오.
◦ 가독성이 뛰어나고 언어 구조상 정적 분석 도구(Static Analysis Tool)의 지원을 받기 유리합니다.
◦ 네임스페이스를 명확히 준수하며 클래스 상수를 정의할 때 필수적입니다.
• 특수한 경우에만 define()을 사용하십시오.
◦ if 문 등을 활용한 조건부 선언이 필요한 경우.
◦ 상수 이름을 동적으로 생성해야 하는 경우.
◦ 전역 스코프에 상수를 강제 등록해야 하는 환경 설정 파일 등.
'Backend > Php' 카테고리의 다른 글
| 산술부터 논리까지: PHP 연산자로 코드에 계산 능력 부여하기 (0) | 2026.02.17 |
|---|---|
| 문자열의 마술: PHP에서 큰따옴표와 작은따옴표의 결정적 차이 (0) | 2026.02.16 |
| 달러($) 기호의 비밀: PHP 변수 선언 규칙과 데이터 타입 완벽 정리 (0) | 2026.02.16 |
| "이 코드는 왜 썼지?" PHP 주석으로 깔끔하게 소통하는 법 (0) | 2026.02.16 |
| PHP 시작하기: HTML 속에 숨겨진 마법의 태그 `<?php ?>` 완벽 가이드 (0) | 2026.02.16 |
