PHP 언어 레퍼런스: 상수 구문

PHP 언어 레퍼런스: 상수 구문 (Syntax)

문서 출처: PHP 공식 매뉴얼 — Constants Syntax (영문 원문 기준) ⚠️ 이 문서는 PHP 8.5.0 시점의 매뉴얼을 기준으로 번역했어요. 하위 버전(PHP 7.x·8.0)과는 일부 동작이 달라질 수 있으니, Error 발생 규칙이나 Changelog 부분은 실행 환경의 PHP 버전을 꼭 확인해 주세요.

구문 (Syntax)

상수는 const 키워드로 정의할 수도 있고, define() 함수로 정의할 수도 있어요.

define()은 상수를 임의의 표현식(expression) 으로 정의할 수 있게 해 주는 반면, const 키워드는 제약이 있어요. 그 제약은 바로 아래 문단에서 설명할게요. 그리고 한번 정의된 상수는 절대 바꾸거나 정의를 해제(undefine)할 수 없어요.

const 키워드를 쓸 때는 스칼라(scalar) 표현식 — bool, int, float, string — 과, 스칼라 표현식만 담고 있는 상수 배열(constant array) 만 받아들여져요. 상수를 리소스(resource)로 정의하는 것도 가능하긴 한데, 예상치 못한 결과를 낳을 수 있으니 피하는 게 좋아요.

상수의 값은 그냥 이름만 지정하면 접근할 수 있어요. 변수와 달리 상수 앞에는 $를 붙이지 않아요. 상수의 이름을 동적으로 얻어야 하는 상황이라면 constant() 함수로 값을 읽을 수도 있고, 정의된 상수 전체 목록이 필요하면 get_defined_constants()로 가져올 수 있어요.

Note: 상수와 (전역) 변수는 서로 다른 네임스페이스(namespace) 에 있어요. 그래서 예를 들어 true$TRUE는 일반적으로 서로 다른 값이에요.

정의되지 않은 상수를 사용하면 Error가 던져져요. PHP 8.0.0 이전에는 정의되지 않은 상수를 "CONSTANT" 같은 그대로의 문자열(bare word string) 로 해석했는데요, 이 폴백(fallback)은 PHP 7.2.0부터 deprecated(권장 안 함)로 지정됐고 그때부터 E_WARNING 단계의 오류가 발생했어요. PHP 7.2.0 이전에는 E_NOTICE 단계의 오류가 났고요. $foo[bar]가 왜 잘못된 표기인지(물론 bar가 상수가 아닐 때)에 대한 설명은 매뉴얼의 관련 항목을 함께 보시는 걸 추천해요. 다만 이 규칙은 (완전히) 한정된 상수(fully qualified constant)에는 적용되지 않아요. 그런 상수는 정의돼 있지 않으면 항상 Error를 던져요.

Note: 상수가 실제로 정의돼 있는지 확인하려면 defined() 함수를 사용하면 돼요.

상수와 변수의 차이를 정리하면 이렇게 돼요.

  • 상수 앞에는 달러 기호($)가 붙지 않아요.
  • 상수는 변수 스코프 규칙과 무관하게 어디서든 정의하고 접근할 수 있어요.
  • 상수는 한번 설정되면 다시 정의하거나 정의를 해제할 수 없어요.
  • 상수는 스칼라 값이나 배열로만 평가될 수 있어요.

예제 1: 상수 정의하기 (defining constants)

<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // Emits an Error: Undefined constant "Constant"
               // Prior to PHP 8.0.0, outputs "Constant" and issues a warning.

define()으로 정의한 뒤 echo CONSTANT;로 값을 출력해요. 눈여겨볼 점은 마지막 줄이에요. Constant처럼 대소문자가 다르면 PHP 8.0.0부터는 Undefined constant "Constant"라는 Error를 던져요. PHP 8.0.0 이전에는 그냥 Constant라는 문자열을 출력하면서 경고만 발생시켰죠.

예제 2: const 키워드로 상수 정의하기

<?php
// Simple scalar value
const CONSTANT = 'Hello World';

echo CONSTANT . "\n";

// Scalar expression
const ANOTHER_CONST = CONSTANT . '; Goodbye World';
echo ANOTHER_CONST . "\n";

const ANIMALS = array('dog', 'cat', 'bird');
echo ANIMALS[1] . "\n"; // outputs "cat"

// Constant arrays
define('ANIMALS_DEF', array(
    'dog',
    'cat',
    'bird'
));
echo ANIMALS_DEF[1] . "\n"; // outputs "cat"

const는 위처럼 단순한 스칼라 값뿐 아니라 스칼라 표현식도 받을 수 있어요. const ANOTHER_CONST = CONSTANT . '; Goodbye World';처럼 다른 상수와 문자열을 이어 붙인 값을 정의할 수 있고, 스칼라만 담긴 배열도 상수로 만들 수 있어요.

Note: define()과 달리, const 키워드로 정의한 상수는 컴파일 타임(compile-time)에 정의되기 때문에 반드시 최상위 스코프(top-level scope) 에서 선언해야 해요. 함수 안, 루프 안, if 문 안, try/catch 블록 안에서는 선언할 수 없다는 뜻이에요.

변경 이력 (Changelog)

버전 설명
8.5.0 상수 표현식에서 타입 캐스트(예: (int), (string))를 지원하기 시작했어요. 또 상수 표현식에서 클로저(Closures)일급 콜러블(first-class callables) 지원도 추가됐어요.

더 보기 (See Also)

  • 클래스 상수 (Class Constants)