Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP関西勉強会のLT資料

Avatar for nishimura syota nishimura syota
June 27, 2025
8

 PHP関西勉強会のLT資料

Avatar for nishimura syota

nishimura syota

June 27, 2025

Transcript

  1. 型付けで安全性向上 Before function calc( $price, $rate ) { return $price

    * $rate; } After function calc( int|float $price, // ← Union型を使用 float $rate // ← 型を追加 ): int|float { // ← 戻り値もUnion型 return $price * $rate; } 効果 静的解析でエラーが発見できる IDEが自動補完 6 型を書くだけで安全性UP!
  2. readonlyで意図しない変更を防止 プロパティが予期せず変更される... class User { public $id; // 単なるint型 public

    $email; public function __construct($id, $email) { $this->id = $id; $this->email = $email; } } $user = new User(1, "[email protected]"); $user->id = 999; // 意図しない変更! $user->id = "ABC"; // 型チェックもなし! 7
  3. readonlyで意図しない変更を防止 意図しない変更を防止 readonly class UserId { public function __construct( public

    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 意図しない変更をブロック!
  4. よくある問題コード class Order { public $id; // 数値のはずだが... public $total;

    // 正の整数のはずだが... public function __construct($id, $total) { $this->id = $id; $this->total = $total; } } $order = new Order(1, 1000); $order->total = -500; // マイナスでも通る $order->id = null; // nullも入る 問題点 型なし・変更可能・不正な値の代入 → バグの温床 9
  5. 型とreadonly で安全設計! readonly class OrderId { public function __construct( public

    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
  6. 明日から始める2ステップ 型付けで安全性向上 function getUser(UserId $id): User { // 型を明記して安全性を高めよう }

    readonlyで意図しない変更を防止 readonly class UserId { public function __construct(public int $value) {} } class User { public function __construct(public readonly UserId $id) {} // 意図しない変更を防止 } 11