본문 바로가기
PHP

[PHP] 객체의 불변성을 보장하는 readonly 프로퍼티

by teamnova 2025. 10. 3.
728x90

안녕하세요. 

오늘은 객체의 불변성을 보장하는 readonly 프로퍼티에 대해 설명드리겠습니다. 

 

코드를 작성하다보면,  객체가 한번 생성된 후에는 특정 값이 절대 변하지 않아야 하는 경우가 많습니다. 

이전에는 이런 '불변성(Immutability)'을 보장하기 위해 프로퍼티를 private으로 선언하고 getter 메소드만 만드는 등 번거로운 작업이 필요했습니다.

PHP 8.1부터 도입된 readonly 키워드로 이 문제를 해결할 수 있습니다.

프로퍼티 앞에 readonly를 붙여주기만 하면, 해당 프로퍼티는 생성자에서 딱 한 번만 초기화될 수 있고, 그 이후에는 값을 절대 변경할 수 없습니다.

 

 

readonly 프로퍼티 사용 예제

 

사용자의 고유 ID와 이메일 정보를 담는 간단한 데이터 전송 객체(DTO)를 readonly를 이용해 만들고,

이미 생성된 객체의 readonly 프로퍼티 값을 변경하려고 시도해보겠습니다. 

<?php

class UserDTO {
    public function __construct(
        public readonly int $id,
        public readonly string $email,
    ) {}
}

// 객체 생성 시점에만 값을 할당할 수 있습니다.
$user = new UserDTO(1, 'test@example.com');

// 초기화된 값을 읽는 것은 당연히 가능합니다.
echo "<br>사용자 ID: " . $user->id . PHP_EOL;
echo "<br>사용자 이메일: " . $user->email . PHP_EOL;


// 아래 코드는 치명적인 오류(Fatal Error)를 발생시킵니다.
try {
  echo "<br> 변경 시도 ";
    $user->id = 2; // 초기화된 readonly 프로퍼티는 수정 불가!
} catch (Error $e) {
    echo "<br>오류 발생: " . $e->getMessage();
}

?>

 

 

결과 

사용자 ID: 1
사용자 이메일: test@example.com
변경 시도
오류 발생: Cannot modify readonly property UserDTO::$id

 

첫 번째 예제 코드는 정상적으로 실행되어 값을 출력합니다.

하지만 두 번째 예제 코드처럼 readonly 프로퍼티의 값을 수정하려고 하면, PHP는 프로그램을 중단시키고 아래와 같은 강력한 오류 메시지를 보여줍니다.