# ch01 — クラスを定義する

Source: https://php-school.pages.dev/topics/class/ch01-class-def/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: クラスの基本
Level: L3

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

## 本文

# ch01 — クラスを定義する

## 概要

クラスは **「関連するデータ (プロパティ) と振る舞い (メソッド) を 1 つの設計図にまとめる」** ための仕組みだ。ユーザー情報を扱うときに `$name` `$age` `$city` といった変数を関数の引数で毎回受け渡ししていると、変数の組み合わせが散らばって追跡が難しくなる。クラスにまとめておけば「ユーザーという 1 つのまとまり」として扱えるようになり、関係するデータと処理がコード上の同じ場所に集まる。

PHP では `class クラス名 { ... }` の形でクラスを宣言し、中に `public string $name;` のようにプロパティを並べる。PHP 7.4 以降はプロパティに型宣言を付けられるようになり、`User` のインスタンスの `$name` には必ず文字列が入ると設計図に書けるようになった。これは関数引数の型宣言 (前章) と同じ考え方で、型のミスマッチを早期に検出できる。

このチャプターでまず腹落ちさせたいのは **「クラスの定義だけでは何も実行されない」** という性質だ。`class User { ... }` を書いてもインスタンスを作る (next chapter) までは画面に何も出ない。クラスは「タイ焼きの **型枠** 」で、実際のタイ焼きは `new` を実行して初めて 1 個生まれる、というメンタルモデルを最初に固める。

## 学習目標

- `class クラス名 { ... }` の形でクラスを宣言できる
- クラスの中にプロパティ (`public 型 $名前;`) を並べられる
- 「定義しただけ」では何も実行されないことを理解する

## 所要時間

スライド 4 分 + ドリル 1 問 = **10 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | `User` クラスを定義する (name と age の 2 プロパティ) |

## 採点

```bash
php scripts/grade.php topics/class/ch01-class-def/drill/01-define-user/
```

## 関連チャプター

- [`ch02-new-instance`](../ch02-new-instance/) — `new` でインスタンスを作る
- [`ch03-properties`](../ch03-properties/) — プロパティの読み書き
- [`ch06-constructor`](../ch06-constructor/) — コンストラクタで初期化

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 8 / Chapter 1
  目的: class キーワードでクラスを定義し、プロパティを宣言できる状態にする
  扱わない: new (ch02) / プロパティアクセス (ch03) / メソッド (ch04) / $this (ch05) / コンストラクタ (ch06) / 修飾子 (ch07) / 継承・static (L9)
  読み上げ時間目安: 3 分半〜4 分
-->

# クラスを定義する

Lesson 8 / Chapter 1

---

## クラスは「設計図」

```php
<?php
class User {
    public string $name;
    public int $age;
}
```

- `class クラス名 { ... }` でクラスを宣言する
- `{ }` の中にプロパティ (持っているデータ) を並べる
- クラス名は **大文字始まり** が慣例 (例: `User`, `Book`)

これは設計図なので、**まだ何も実体が無い** 状態。

---

## プロパティは「型 名前」で並べる

```php
<?php
class Book {
    public string $title;
    public int $price;
}
```

- `public` は「外から触れる」という印 (ch07 で詳しく)
- `string $title;` は「文字列型のプロパティ `$title`」
- `int $price;` は「整数型のプロパティ `$price`」
- 各プロパティの末尾に `;` が必要

---

## 「定義しただけ」では何も起こらない

```php
<?php
class User {
    public string $name;
    public int $age;
}

echo "OK\n";
```

実行結果:

```
OK
```

- クラスを定義しても、**自動で実体が作られたりはしない**
- 実体を作るには `new` が必要 (ch02 で学ぶ)
- この時点では「設計図がメモリに登録された」だけ

---

## よくあるミス

```php
<?php
class user {        // ❌ 小文字始まりは慣例違反 (動くが読みにくい)
    string $name;   // ❌ public 等の修飾子が無い
    public $age     // ❌ 末尾のセミコロン抜け
}
```

直したもの:

```php
<?php
class User {
    public string $name;
    public int $age;
}
```

---

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

✅ `class クラス名 { ... }` でクラスを宣言できる
✅ プロパティを `public 型 $名前;` の形で並べられる
✅ クラスは設計図であって、定義だけでは実体が無いと言える

→ ドリルへ
