읽기 전용 속성 (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를 식별하거나 생성 후 변경되어서는 안 되는 데이터에 이상적이며, 런타임 초기화의 유연성과 실수로 인한 수정을 방지하는 안전성을 결합합니다.
챌린지
쉬움초기화 후 중요한 설정이 실수로 변경되지 않도록 readonly properties를 사용하는 변경 불가능한 configuration system을 만들어 보겠습니다.
application configuration을 관리하기 위해 함께 작동하는 두 개의 파일을 만듭니다:
Config.php: 변경 불가능한 설정을 사용하는 application configuration을 나타내는Configclass를 정의합니다. 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를 사용하여Configobject를 생성합니다. 첫 번째 줄에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 속성을 한 줄씩 출력:
// - 앱 이름
// - 버전
// - 최대 연결 수
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러