Readonly 프로퍼티 (PHP 8.1)
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 19번째.
PHP 8.1에서 도입된 readonly 프로퍼티는 한 번만 할당할 수 있으며 그 이후에는 수정할 수 없습니다. 상수와 달리, readonly 프로퍼티는 클래스 정의 시점이 아니라 객체 초기화 중에 설정됩니다.
타입 선언 앞에 readonly 키워드를 추가하여 readonly 속성을 선언합니다:
<?php
class User {
public readonly string $id;
public readonly string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;
출력:
U001
Alice일단 할당되면, readonly 속성을 변경하려고 시도하면 오류가 발생합니다. 이로 인해 ID나 생성 타임스탬프와 같이 객체의 수명 주기 동안 일정하게 유지되어야 하는 값에 사용하기에 완벽합니다.
Readonly 속성은 타입 선언이 있어야 하며, 생성자에서 또는 선언 시점에 단 한 번만 초기화될 수 있습니다. 이들은 모든 가시성 수정자와 함께 작동합니다:
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
public function getCost(): float {
return $this->cost;
}
}
$product = new Product("ABC123", 29.99);
echo $product->sku;
출력:
ABC123핵심 포인트: Readonly 프로퍼티는 프로퍼티 수준에서 불변성을 제공합니다. 이는 객체를 식별하거나 생성 후 변경되지 않아야 하는 데이터에 이상적이며, 런타임 초기화의 유연성과 실수로 인한 수정을 방지하는 안전성을 결합합니다.
챌린지
쉬움초기화 후 중요한 설정이 실수로 변경되지 않도록 readonly 속성을 사용하는 불변(immutable) 설정 시스템을 구축해 보겠습니다.
애플리케이션 설정을 관리하기 위해 함께 작동하는 두 개의 파일을 생성합니다:
Config.php— 불변 설정이 포함된 애플리케이션 설정을 나타내는Config클래스를 정의합니다. 이 클래스는 세 개의 public readonly 속성인string $appName,string $version,int $maxConnections를 가져야 합니다. 생성자 프로모션(constructor promotion)을 사용하여 하나의 깔끔한 생성자 정의 내에서 세 가지 readonly 속성을 모두 선언하고 초기화하세요."[appName] v[version] (max: [maxConnections] connections)"형식의 문자열을 반환하는getInfo()메서드를 추가하세요.main.php— Config 클래스 파일을 포함합니다. 앱 이름, 버전, 최대 연결 수(정수로 변환해야 하는 문자열)의 세 가지 입력을 받게 됩니다. 이 값들을 사용하여Config객체를 생성하세요. 첫 번째 줄에getInfo()의 결과를 출력하세요. 그런 다음 각 readonly 속성에 직접 접근하여 앱 이름, 버전, 최대 연결 수를 각각 별도의 줄에 출력하세요.
readonly 속성은 설정이 한 번 생성되면 그 값이 고정되도록 보장하며, 이는 애플리케이션 실행 동안 일정하게 유지되어야 하는 설정에 적합합니다. 생성자 프로모션과 readonly가 결합되어 불변 값 객체(immutable value objects)를 정의하는 매우 간결한 방법을 어떻게 만드는지 확인해 보세요.
출력에는 포맷된 정보 문자열과 각 개별 속성 값이 표시되어야 하며, 이를 통해 readonly 속성이 클래스 외부에서도 여전히 읽기 가능하다는 것을 보여줍니다.
치트 시트
PHP 8.1에서 readonly 프로퍼티가 도입되었습니다. 이 프로퍼티는 한 번만 할당할 수 있으며 그 이후에는 수정할 수 없습니다.
<?php
class User {
public readonly string $id;
public readonly string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User("U001", "Alice");
echo $user->id; // U001
Readonly 프로퍼티는 반드시 타입 선언이 있어야 하며 한 번만 초기화될 수 있습니다. 모든 가시성 제어자(visibility modifier)와 함께 사용할 수 있으며 생성자 프로모션(constructor promotion)과 결합하여 사용할 수도 있습니다.
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
}
$product = new Product("ABC123", 29.99);
echo $product->sku; // ABC123
Readonly 프로퍼티는 ID, 타임스탬프 또는 설정 값과 같이 객체의 수명 동안 일정하게 유지되어야 하는 값에 사용하기 이상적입니다.
직접 해보기
<?php
require_once 'Config.php';
// 입력 읽기
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO: 입력 값을 사용하여 Config 객체 생성
// TODO: getInfo()의 결과 출력
// TODO: 각 읽기 전용 속성을 별도의 줄에 출력:
// - 앱 이름
// - 버전
// - 최대 연결 수
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션3클래스 프로퍼티
인스턴스 vs 정적 프로퍼티클래스 내 상수정적 메서드와 프로퍼티Private 및 Protected 프로퍼티Readonly 프로퍼티 (PHP 8.1)요약 - 은행 계좌 관리 프로그램