클래스 상수

클래스 상수 (Class Constants)

클래스를 기준으로 삼아 상수를 정의하는 게 가능해요. 클래스 상수의 기본 가시성(visibility)은 public이에요.

Note:

클래스 상수는 자식 클래스에서 다시 정의할 수 있어요. 다만 PHP 8.1.0부터는 상수가 final로 정의된 경우 자식 클래스에서 다시 정의할 수 없어요.

인터페이스도 상수를 가질 수 있어요. 예시는 인터페이스 문서를 참고하시면 돼요.

변수를 사용해서 클래스를 참조하는 것도 가능해요. 이때 변수의 값은 키워드(예: self, parent, static)가 될 수 없어요.

또 하나 짚어둘 점은, 클래스 상수는 각 클래스 인스턴스마다가 아니라 클래스마다 한 번씩 할당된다는 거예요.

PHP 8.3.0부터는 클래스 상수에 bool, int, float, string 같은 스칼라 타입, 나아가 array까지 지정할 수 있어요. array를 쓸 때 그 내용물은 다른 스칼라 타입만 들어갈 수 있어요.

예제 #1 상수 정의하고 사용하기

<?php
class MyClass
{
    const CONSTANT = 'constant value';

    function showConstant() {
        echo  self::CONSTANT . "\n";
    }
}

echo MyClass::CONSTANT . "\n";

$classname = "MyClass";
echo $classname::CONSTANT . "\n";

$class = new MyClass();
$class->showConstant();

echo $class::CONSTANT."\n";
?>

특별한 ::class 상수는 컴파일 시점에 완전한 클래스 이름(full qualified class name)을 결정해 줘요. 네임스페이스를 쓰는 클래스에서 특히 유용하죠.

예제 #2 네임스페이스를 쓴 ::class 예시

<?php
namespace foo {
    class bar {
    }

    echo bar::class; // foo\bar
}
?>

예제 #3 클래스 상수 표현식 예시

<?php
const ONE = 1;
class foo {
    const TWO = ONE * 2;
    const THREE = ONE + self::TWO;
    const SENTENCE = 'The value of THREE is '.self::THREE;
}
?>

예제 #4 PHP 7.1.0부터 사용 가능한 클래스 상수 가시성 한정자

<?php
class Foo {
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAZ, PHP_EOL;
?>

위 예시를 PHP 7.1에서 실행한 결과:


bar

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …

Note:

PHP 7.1.0부터 클래스 상수에 가시성 한정자를 쓸 수 있어요.

예제 #5 PHP 8.3.0부터 적용되는 클래스 상수 가시성 변동(visibility variance) 검사

<?php

interface MyInterface
{
    public const VALUE = 42;
}

class MyClass implements MyInterface
{
    protected const VALUE = 42;
}
?>

위 예시를 PHP 8.3에서 실행한 결과:


Fatal error: Access level to MyClass::VALUE must be public (as in interface MyInterface) …

Note:

PHP 8.3.0부터는 가시성 변동이 더 엄격하게 검사돼요. 그 이전 버전에서는 클래스 상수의 가시성이 구현한 인터페이스에 있는 상수의 가시성과 달라도 됐어요.

예제 #6 PHP 8.3.0부터 사용 가능한 클래스 상수 가져오기 문법

<?php
class Foo {
    public const BAR = 'bar';
    private const BAZ = 'baz';
}

$name = 'BAR';
echo Foo::{$name}, PHP_EOL; // bar
?>

Note:

PHP 8.3.0부터는 변수를 사용해 클래스 상수를 동적으로 가져올 수 있어요.

예제 #7 PHP 8.3.0부터 클래스 상수에 타입 지정하기

<?php

class MyClass {
    public const bool MY_BOOL = true;
    public const int MY_INT = 1;
    public const float MY_FLOAT = 1.01;
    public const string MY_STRING = 'one';
    public const array MY_ARRAY = [self::MY_BOOL, self::MY_INT, self::MY_FLOAT, self::MY_STRING];
}

var_dump(MyClass::MY_BOOL);
var_dump(MyClass::MY_INT);
var_dump(MyClass::MY_FLOAT);
var_dump(MyClass::MY_STRING);
var_dump(MyClass::MY_ARRAY);
?>

위 예시를 PHP 8.3에서 실행한 결과:


bool(true)
int(1)
float(1.01)
string(3) "one"
array(4) {
  [0]=>
  bool(true)
  [1]=>
  int(1)
  [2]=>
  float(1.01)
  [3]=>
  string(3) "one"
}