상수는 스크립트가 실행되는 동안 절대 바뀌지 않는 값에 붙인 이름입니다. const MAX_USERS = 100;이나 define('MAX_USERS', 100);로 선언하고, $ 없이 이름만으로 사용합니다.
관례상 상수 이름은 UPPER_SNAKE_CASE입니다. 상수는 전역이므로, 파일 맨 위에서 선언한 상수는 global 없이 모든 함수 안에서 보입니다.
define()과 const
둘 다 상수를 만들지만 동작 시점이 다릅니다. const는 PHP가 파일을 컴파일할 때 처리되고, define()은 다른 함수 호출처럼 실행됩니다.
const | define() | |
|---|---|---|
if, 반복문, 함수 안에서 | 불가 | 가능 |
| 변수로 만든 이름 | 불가 | 가능 |
| 클래스 상수 | 가능 | 불가 |
| 값으로 표현식 사용 | 가능, 상수와 리터럴로 된 것 | 가능, 어떤 값이든 |
| 네임스페이스 자동 적용 | 예 | 아니요(전체 이름을 지정) |
더 짧고 컴파일 시점에 확인되므로 기본으로는 const를 쓰세요. 상수가 조건이나 계산된 이름에 따라 달라질 때는 define()을 쓰세요.
상수는 바꿀 수 없다
상수에 대입하면 구문 에러입니다.
<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error: syntax error, unexpected token "=" in /home/index.php on line 3
같은 상수를 두 번 정의하는 것은 에러가 아니지만, PHP는 경고를 출력하고 첫 번째 값을 유지합니다.
<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3
값이 이미 설정되었을 수 있다면(예: 여러 번 로드되는 설정 파일) 먼저 defined()로 확인하세요.
상수 배열
상수에 배열을 담을 수 있습니다. NAME[key]로 읽고, 반복하고, 전달할 수 있지만 수정할 수는 없습니다.
클래스 상수
클래스 안에서 const는 클래스에 속한 상수를 선언합니다. 밖에서는 ClassName::NAME으로, 안에서는 self::NAME이나 static::NAME으로 읽습니다. 클래스 상수는 가시성을 가질 수 있고, final일 수 있으며, PHP 8.3부터는 타입을 선언할 수 있습니다.
STATUS_NEW, STATUS_PAID처럼 관련된 클래스 상수 묶음은 enum으로 쓰는 편이 나은 경우가 많습니다. enum은 잘못된 값이 전달되는 것도 막아 줍니다.
매직 상수: LINE, FILE, DIR 등
매직 상수는 나타나는 위치에 따라 값이 바뀝니다. 컴파일 시점에 채워집니다.
가장 많이 쓰는 것은 현재 파일의 디렉터리인 __DIR__입니다. 이것으로 include 경로를 만들면 스크립트를 어느 디렉터리에서 시작했든 동작합니다: require __DIR__ . '/config.php';. 전체 패턴은 include와 require를 보세요.
알아 두면 좋은 내장 상수
PHP는 자체 상수를 많이 정의합니다. 다음은 늘 등장하는 것들입니다.
PHP_EOL은 PHP가 실행되는 시스템의 줄 끝 문자입니다(Linux와 macOS는 "\n", Windows는 "\r\n"). 파일과 터미널에 쓰는 텍스트용이며, HTML 출력에서는 줄바꿈이 보이지 않으므로 <br>을 쓰세요.
자주 묻는 질문
PHP에서 define()과 const의 차이는 무엇인가요?
const는 파일을 컴파일할 때 처리되는 언어 구문으로, 최상위와 클래스 안에서는 동작하지만 if, 반복문, 함수 안에서는 동작하지 않습니다. define()은 실행 시점에 호출되는 함수이므로 어디서나 동작하고 변수로 이름을 만들 수 있지만, 클래스 상수는 선언할 수 없습니다.
PHP 상수에 배열을 담을 수 있나요?
네. const COLORS = ['red', 'green'];와 define('COLORS', ['red', 'green']); 모두 동작하며, 요소는 COLORS[0]으로 읽습니다. 배열은 나중에 수정할 수 없습니다.
PHP에서 상수가 정의되었는지 어떻게 확인하나요?
이름을 문자열로 받아 true나 false를 반환하는 defined('NAME')을 쓰세요. 흔한 패턴은 if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }입니다. 클래스 상수에는 'ClassName::NAME'을 넘깁니다.
PHP의 매직 상수란 무엇인가요?
쓰인 위치에 따라 값이 달라지는 상수입니다: __LINE__(현재 줄), __FILE__(파일 전체 경로), __DIR__(그 디렉터리), __FUNCTION__, __CLASS__, __METHOD__, __NAMESPACE__. 양쪽에 밑줄 두 개를 붙여 쓰며 대소문자를 구분하지 않습니다.