# ch07 — クラス定数 (const)

Source: https://php-school.pages.dev/topics/class-advanced/ch07-const/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: クラスの応用
Level: L3

Reference (official): https://www.php.net/manual/ja/language.oop5.inheritance.php

## 本文

# ch07 — クラス定数 (const)

## 概要

クラス定数は **「クラスに紐付いた変更できない値」** で、`class Config { const VERSION = "1.0"; }` のように `const` キーワードで宣言する。インスタンスを作らずに `Config::VERSION` の形で参照でき、`static` プロパティと違って **代入で書き換えることが一切できない**。バージョン番号・上限値・状態名 (`STATUS_ACTIVE` 等) のような「コードを書いた時点で確定していて、実行中に変わらない値」を集約しておく場所として使う。

書き方は `const NAME = 値;` で、クラスの `{ }` の中に置く。値には数値・文字列・配列・他の定数式が書ける。外から参照するときは `ClassName::NAME`、クラス内からは `self::NAME` の形で、`static` プロパティと違って `$` は付かない。マジックナンバー (`if ($status === 2)`) をコードに散らばらせず、`if ($status === Order::STATUS_PAID)` と書けるようになるのが、読み手に対するいちばん大きな効果になる。

補足として PHP 8.1 以降には **`enum` (列挙型)** が導入されていて、「決まった選択肢のうちのどれか」を表現するならクラス定数より `enum` のほうが型として強く守れる。`enum Status { case Active; case Paid; }` のように書ける。古いコードベースではクラス定数で十分なケースも多いが、新規設計では「集約された定数群は enum 化を検討する」流れになっていることだけ意識しておく。

## 学習目標

- `const NAME = 値;` でクラスに「変えられない値」を持たせられる
- `ClassName::NAME` (外) / `self::NAME` (中) で参照する
- `static` プロパティとの違い (変更可否) を理解する

## 所要時間

スライド 4 分 = **4 分**

## ドリル

このチャプターはスライドのみ。次の章へ。

採点ドリルは無し。スライドで概念を理解したら ch08 (final) に進む。

## 関連チャプター

- [`ch06-static`](../ch06-static/) — 変更可能な static プロパティとの対比
- [`ch08-final`](../ch08-final/) — 拡張禁止と組み合わせて「動かない仕様」を守る

## スライド

---
marp: true
theme: dojo
paginate: true
size: 16:9
---

<!--
LLM_CONTEXT:
  Lesson 9 / Chapter 7
  目的: const でクラスに変更不能な値 (定数) を持たせ、ClassName::NAME で参照できるようにする
  扱わない: enum (PHP 8.1+) / interface の定数 / 型宣言付き定数 (PHP 8.3+) は範囲外
  読み上げ時間目安: 3 分半〜4 分
-->

# クラス定数 (const)

Lesson 9 / Chapter 7

---

## 「変えてはいけない値」をクラスに持たせたい

```php
<?php
class Tax {
    public static float $rate = 0.10;
}

Tax::$rate = 0.20;   // ❌ うっかり書き換わってしまう
```

- `static` プロパティは便利だが、誰でも書き換えられる
- 税率や円周率など「変わってはいけない値」には不向き

---

## `const` で書き換え不能な値を定義

```php
<?php
class Tax {
    const RATE = 0.10;
}
```

- `const 名前 = 値;` の形式
- 定数名は **大文字** が慣例 (`RATE`, `MAX_AGE` など)
- `$` は付けない (変数ではないので)

---

## 参照方法

```php
<?php
echo Tax::RATE . "\n";   // 0.1
// Tax::RATE = 0.20;     // ❌ Fatal error: 定数は変更できない
```

- 外からは `ClassName::NAME` で参照
- クラス内からは `self::NAME` で参照
- **書き換えようとすると即エラー**

---

## クラス内での使用例

```php
<?php
class Tax {
    const RATE = 0.10;

    public static function withTax(int $price): float {
        return $price * (1 + self::RATE);
    }
}

echo Tax::withTax(1000) . "\n";  // 1100
```

- メソッド内では `self::RATE` で呼ぶ
- 値が 1 箇所で管理され、改修も楽

---

## `static` プロパティとの違い

|  | `static $name` | `const NAME` |
|---|---|---|
| 値の変更 | できる | **できない** |
| 命名 | `$camelCase` | `UPPER_CASE` |
| 用途 | 共有される状態 | 不変の設定値 |

「変えていい値 = static、変えてはいけない値 = const」と覚える。

---

## このチャプターでできるようになること

✅ `const` でクラス定数を定義できる
✅ `ClassName::NAME` / `self::NAME` で参照できる
✅ 書き換えるとエラーになることを知っている
✅ static との使い分けを言える

関連: 同トピック内の他チャプター (このチャプターは採点ドリル無し)
