클래스 상수 (Class Constants)
클래스 상수(Class Constant)는 객체 인스턴스마다 할당되지 않고, 클래스 범위 자체에 단 하나만 정의되어 변하지 않는 고정 값을 보관하는 용도로 사용됩니다.
PHP 버전이 진화하면서 상수의 접근 제어(가시성) 및 타입 안전성을 강제할 수 있는 강력한 기능들이 차례로 내장되었습니다. 각 상세 규칙과 지원 버전을 배웁니다.
1. 클래스 상수 정의와 참조 방식
클래스 내부에 const 키워드를 사용하여 상수를 정의합니다. 일반 변수와 달리 앞에 $ 기호가 없으며 관례상 대문자로 명명합니다.
인스턴스 생성(new) 없이도 클래스 이름 뒤에 범위 정의 연산자(이중 콜론, ::)를 붙여 직접 접근 가능합니다.
class Language {
const ENGLISH = "en";
const KOREAN = "ko";
}
// 1. 클래스 외부에서 호출 (인스턴스 생성 없이 직접 참조)
echo Language::KOREAN; // "ko" 출력
// 2. 클래스 내부 메서드 안에서 호출 (self 키워드 사용)
class LanguageHelper {
const DEFAULT_LANG = 'ko';
public function getDefault(): string {
return self::DEFAULT_LANG;
}
}
2. 클래스 상수 접근 제어 (Constant Visibility) — [PHP 7.1+]
PHP 7.0 이전의 클래스 상수는 무조건 public 지시어로 선언된 것으로 간주하여 외부에서 제한 없이 누구나 읽을 수 있었습니다.
PHP 7.1부터는 상수의 선언부 앞에 public, protected, private 접근 제어자를 부착하여 상수의 참조 유효 범위를 엄격히 차단할 수 있게 되었습니다.
class Database {
// 외부 전체 오픈
public const PORT = 3306;
// 이 클래스 본인 및 상속(자식) 클래스 메서드 내부에서만 사용
protected const DRIVER = 'mysql';
// 이 클래스 본인의 메서드 내부에서만 비밀스럽게 사용
private const PASSWORD = 'super-secret-password';
}
echo Database::PORT; // 3306 (허용)
// echo Database::PASSWORD; // ❌ 에러! Fatal error: Cannot access private const Database::PASSWORD
3. 타입이 정의된 클래스 상수 (Typed Class Constants) — [PHP 8.3+]
상수의 값이 상속 관계나 코드 갱신 과정에서 엉뚱한 성격의 데이터 타입으로 변경되어 예기치 못한 타입 에러를 일으키는 현상을 방어하기 위해 PHP 8.3부터는 클래스 상수의 데이터 타입을 명시적으로 지정(Typed Constants)할 수 있습니다.
class Application {
// 상수 이름 앞에 데이터 타입을 명시합니다.
public const string VERSION = "2.1.0";
protected const int MAX_CONNECTIONS = 50;
private const float PI = 3.14159;
}
class CustomApp extends Application {
// ❌ 에러! 부모 클래스 Application에서 int로 정의한 상수를 자식 클래스에서 string으로 오버라이딩 시도함
// public const string MAX_CONNECTIONS = "unlimited";
}
상수 타입의 특징:
- 부모 클래스에서 지정한 상수의 타입을 자식 클래스가 맘대로 변경할 수 없어 타입 일관성이 보장됩니다.
- 지정된 타입과 런타임에 대입된 실제 값의 타입이 불일치하는 경우 컴파일 오류(
TypeError)가 즉각 발생하여 코드 신뢰성을 크게 제고합니다.
이전 학습
« 열거형 (Enum)
서브목차