Menu
Coddy logo textTech

읽기 전용 속성 (PHP 8.1)

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 19번째.

PHP 8.1에서는 한 번만 할당할 수 있고 이후에는 수정할 수 없는 readonly properties가 도입되었습니다. 상수와 달리 readonly properties는 class 정의 시점이 아니라 object 초기화 중에 설정됩니다.

타입 선언 앞에 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 property를 변경하려고 할 때 오류가 발생합니다. 따라서 ID나 생성 타임스탬프처럼 object의 수명 동안 일정하게 유지되어야 하는 values에 적합합니다.

읽기 전용 프로퍼티는 타입 선언이 있어야 하며, 선언한 클래스 내부(일반적으로 constructor 내부)에서 한 번만 할당할 수 있습니다. 일반 프로퍼티와 달리 선언할 때 기본값을 지정할 수 없습니다. 모든 가시성 변경자와 함께 사용할 수 있습니다:

<?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 properties는 property 수준에서 불변성을 제공합니다. 이는 object를 식별하거나 생성 후 변경되어서는 안 되는 데이터에 이상적이며, 런타임 초기화의 유연성과 실수로 인한 수정을 방지하는 안전성을 결합합니다.

challenge icon

챌린지

쉬움

초기화 후 중요한 설정이 실수로 변경되지 않도록 readonly properties를 사용하는 변경 불가능한 configuration system을 만들어 보겠습니다.

application configuration을 관리하기 위해 함께 작동하는 두 개의 파일을 만듭니다:

  • Config.php: 변경 불가능한 설정을 사용하는 application configuration을 나타내는 Config class를 정의합니다. class에는 세 개의 public readonly properties인 string $appName, string $version, int $maxConnections가 있어야 합니다. constructor promotion을 사용하여 하나의 간결한 constructor 정의에서 세 readonly properties를 모두 선언하고 초기화합니다. getInfo() method를 추가하여 "[appName] v[version] (max: [maxConnections] connections)" 형식의 string을 반환하도록 합니다.
  • main.php: Config class 파일을 포함합니다. app name, version, maximum connections라는 three inputs를 받습니다. maximum connections는 int로 변환해야 하는 string입니다. 이러한 values를 사용하여 Config object를 생성합니다. 첫 번째 줄에 getInfo()의 result를 Print합니다. 그런 다음 각 readonly property에 직접 access하여 각 property를 자체 줄에 Print합니다. 즉 app name, version, max connections를 출력합니다.

readonly properties를 사용하면 configuration이 생성된 후 그 values가 고정되므로 application의 runtime 전체에서 constant하게 유지되어야 하는 settings에 적합합니다. constructor promotion과 readonly를 함께 사용하면 immutable value objects를 매우 간결하게 정의할 수 있다는 점에 주목하세요.

출력에는 formatted info string이 표시된 다음 각 개별 property value가 표시되어야 합니다. 이를 통해 readonly properties도 class 외부에서 계속 read할 수 있음을 보여 줍니다.

직접 해보기

<?php

require_once 'Config.php';

// 입력 읽기
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));

// TODO: 입력 값을 사용하여 Config 객체 생성

// TODO: getInfo()의 결과 출력

// TODO: 각 readonly 속성을 한 줄씩 출력:
// - 앱 이름
// - 버전
// - 최대 연결 수

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러