클래스 상수
클래스 상수 (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"
}