Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 클래스 상수 완벽 가이드: 정의부터 가시성 제어까지

PHP 클래스 상수란?

PHP에서는 클래스 내부에 변경되지 않는 고정 값을 가지는 식별자, 즉 클래스 상수(class constant)를 정의할 수 있습니다. 클래스 상수는 클래스 단위로 유지되며 인스턴스마다 달라지지 않는 불변의 값입니다.

클래스 내부의 변수나 프로퍼티와 구분하기 위해 상수 이름 앞에는 $ 기호를 붙이지 않으며, const 키워드를 사용하여 정의합니다.

클래스 상수의 기본 가시성은 public이지만, 정의 시점에 다른 접근 제어자(private, protected)를 지정할 수도 있습니다. 상수에 할당되는 값은 반드시 일정한 표현식이어야 하며, 변수나 함수 호출, 프로퍼티 참조는 허용되지 않습니다.

클래스 상수에 접근하려면 범위 지정 연산자(::)를 사용하여 클래스 이름을 통해 접근하고, 클래스 내부의 메서드 안에서는 self 키워드를 통해 참조할 수 있습니다.

기본 문법

class SomeClass{
    const CONSTANT = 'constant value';
}
echo SomeClass::CONSTANT;

상수 이름은 대소문자를 구분하며, 관례적으로 대문자로 작성하는 것이 좋습니다.

클래스 상수 정의 및 접근 예제

다음 예제는 클래스 상수를 정의하고 외부에서 접근하는 방법을 보여줍니다.

예제

<?php
class square{
    const PI=M_PI;
    var $side=5;
    function area(){
        $area=$this->side**2*self::PI;
        return $area;
    }
}
$s1=new square();
echo "PI=". square::PI . "\n";
echo "area=" . $s1->area();
?>

실행 결과

PI=3.1415926535898
area=78.539816339745

위 예제에서 square::PI처럼 클래스 이름으로 직접 상수에 접근할 수 있고, area() 메서드 내부에서는 self::PI를 사용하여 상수를 참조합니다.

표현식을 값으로 사용하는 클래스 상수

클래스 상수에는 변수가 아닌 상수 표현식을 할당할 수 있습니다. 아래 예제에서는 전역 상수 X와 Y의 나눗셈 결과를 클래스 상수 PI에 할당합니다.

예제

<?php
const X = 22;
const Y=7;
class square {
    const PI=X/Y;
    var $side=5;
    function area(){
        $area=$this->side**2*self::PI;
        return $area;
    }
}
$s1=new square();
echo "PI=". square::PI . "\n";
echo "area=" . $s1->area();
?>

실행 결과

PI=3.1428571428571
area=78.571428571429

클래스 상수의 가시성 제어자

PHP 7.1부터 클래스 상수에도 public, protected, private 접근 제어자를 지정할 수 있습니다. 기본값은 public이므로 별도로 명시하지 않아도 외부에서 접근 가능하지만, private로 선언된 상수는 클래스 외부에서 접근할 수 없습니다.

예제

<?php
class example {
    const X=10;
    private const Y=20;
}
$s1=new example();
echo "public=". example::X. "\n";
echo "private=" . $s1->Y ."\n";
echo "private=" . $example::Y ."\n";
?>

실행 결과

public=10
PHP Notice: Undefined property: example::$Y in line 11
private=PHP Fatal error: Uncaught Error: Cannot access private const example::Y

실행 결과를 보면 public 상수인 X는 정상적으로 출력되지만, private 상수인 Y에 접근하려고 하면 치명적인 오류(Fatal Error)가 발생하여 프로그램이 중단됩니다. 또한 객체 프로퍼티처럼 -> 연산자로 상수에 접근하면 정의되지 않은 프로퍼티라는 경고가 발생하므로, 상수에는 반드시 범위 지정 연산자 ::를 사용해야 합니다.