int $value ) {} } class User { public function __construct( public readonly UserId $id, public readonly UserEmail $email ) {} } $user = new User( new UserId(1), new UserEmail("[email protected]") ); // $user->id = new UserId(999); // エラー! メリット 変更を防止 型安全性 8 意図しない変更をブロック!
int $value ) {} } readonly class Money { public function __construct( public int $amount ) { if ($amount < 0) { throw new InvalidArgumentException( '金額は負の値にできません' ); } } } class Order { public function __construct( public readonly OrderId $id, public readonly Money $total ) {} } // 正しい使い方 $order = new Order( new OrderId(1), new Money(1000) ); // これらはエラーになる // $order->total = new Money(500); // readonlyで変更不可 // new OrderId('注文'); // 型エラー // new Money(-1000); // 例外発生 改善効果:不正な変更を防止・型安全性の向上 10
readonlyで意図しない変更を防止 readonly class UserId { public function __construct(public int $value) {} } class User { public function __construct(public readonly UserId $id) {} // 意図しない変更を防止 } 11