PHP 상수(Constants)

PHP 상수(Constants)

스크립트를 짜다 보면 어디에서든 그대로 쓰고 싶은 값이 있어요. 예를 들어 결제율이나 버전 번호 같은 건 한 번 정하면 바뀌지 않죠. PHP에서는 그런 값에 이름을 붙여 놓은 것을 상수(constant)라고 불러요. 이름 값 그대로, 스크립트가 실행되는 동안에는 그 값을 바꿀 수 없어요.

출처: PHP Manual — Constants

본문

상수는 단순한 값을 가리키는 식별자(이름)예요. 이름에서 짐작하시겠지만, 스크립트가 실행되는 동안에는 그 값이 바뀌지 않아요. 딱 하나 예외가 있는데, **매직 상수(magic constants)**라고 부르는 것들이에요. 사실 이것들은 상수가 아니에요. 상수는 대소문자를 구분해요(case-sensitive). 관례적으로 상수 이름은 항상 대문자로 써요.

Note: PHP 8.0.0 이전에는 define() 함수로 정의한 상수가 대소문자를 구분하지 않을 수 있었어요.

Note: PHP 8.5.0부터는 이미 정의된 상수를 다시 선언하는 것이 deprecated(권장되지 않음) 처리됐어요.

상수 이름 짓는 규칙

상수 이름은 PHP의 다른 레이블과 같은 규칙을 따라요. 유효한 상수 이름은 문자나 밑줄(_)로 시작하고, 그 뒤에는 문자, 숫자, 밑줄이 몇 개든 이어질 수 있어요. 정규식으로 표현하면 이렇게 돼요.

^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

참고로 여기서 '문자'라 하면 a-z, A-Z 그리고 ASCII 128부터 255까지(0x80-0xff)의 문자를 말해요.

한편 define()으로 예약어나 아예 유효하지 않은 이름의 상수도 정의할 수 있어요. 다만 그런 상수의 값은 constant() 함수로만 꺼내 쓸 수 있어요. 하지만 그렇게 쓰는 건 권장하지 않아요.

예제: 유효한 이름과 유효하지 않은 이름

<?php

// Valid constant names
define("FOO",     "something");
define("FOO2",    "something else");
define("FOO_BAR", "something more");

// Invalid constant names
define("2FOO",    "something");

// This is valid, but should be avoided:
// PHP may one day provide a magical constant
// that will break your script
define("__FOO__", "something");

숫자로 시작하는 2FOO는 유효하지 않아요. 그리고 __FOO__처럼 밑줄 두 개로 둘러싼 이름은 지금은 문법적으로 유효하지만 피해야 해요 — PHP가 나중에 예약된 매직 상수로 만들어서 스크립트를 망가뜨릴 수도 있거든요.

상수의 스코프는 전역

슈퍼글로벌(superglobals)처럼, 상수의 스코프는 전역이에요. 스코프와 상관없이 스크립트 어디에서든 상수에 접근할 수 있어요. 스코프에 대한 자세한 내용은 변수 스코프 문서에서 다뤄요.

Note: PHP 7.1.0부터 클래스 상수는 protectedprivate 가시성(visibility)을 선언할 수 있어요. 그러면 해당 클래스가 정의된 계층적 스코프에서만 사용할 수 있어요.

더 알아보기