# ch02 — new でインスタンスを作る

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

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

## 本文

# ch02 — new でインスタンスを作る

## 概要

クラスは設計図に過ぎないので、実際にデータを保持して使うには **インスタンス (実体)** を作る必要がある。`$user = new User();` のように `new クラス名()` を書くと、`User` の設計図から実体が 1 つ作られて変数に入る。ここから初めて `$user->name = "太郎";` のようにプロパティに値を代入し、データを保持できるようになる。

1 つのクラスからインスタンスは **何個でも** 作れて、それぞれ独立した状態を持つ。`$a = new User();` と `$b = new User();` で 2 つ作り、`$a->name = "太郎"; $b->name = "花子";` とすれば、a と b はそれぞれ別の名前を持つ別人として共存する。タイ焼きの型枠 (クラス) から、何個でもタイ焼き (インスタンス) を焼ける、という関係性をここで確認する。

混同しやすいのが **「クラス」と「インスタンス」の用語**。`User` (クラス) と `$user` (インスタンス) は別物で、片方を「ユーザー」と曖昧に呼ぶと議論が滑る。本シリーズでは「クラス = 設計図、インスタンス = 実体」「クラス名は大文字始まり、インスタンスは小文字始まりの変数」という命名規則を意識的に使い分けるので、読み書きするときに区別を付けておく。

## 学習目標

- `new クラス名()` でインスタンス (実体) を作れる
- 1 つのクラスから何個でもインスタンスを作れることを理解する
- インスタンスは変数に入れて使うことを理解する

## 所要時間

スライド 4 分 + ドリル 2 問 = **12 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | `User` インスタンスを 1 つ作って `name` を出す |
| 02 | `User` インスタンスを 2 つ作って両方の `name` を出す |

## 採点

```bash
php scripts/grade.php topics/class/ch02-new-instance/drill/01-new-one/
```

## 関連チャプター

- [`ch01-class-def`](../ch01-class-def/) — クラス定義 (前提)
- [`ch03-properties`](../ch03-properties/) — プロパティの読み書き
- [`ch06-constructor`](../ch06-constructor/) — `new` の瞬間に初期化

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 8 / Chapter 2
  目的: new クラス名() でインスタンスを生成し、変数に保持できるようにする
  扱わない: メソッド (ch04) / $this (ch05) / コンストラクタ (ch06) / 修飾子 (ch07) / 継承・static (L9)
  読み上げ時間目安: 3 分半〜4 分
-->

# new でインスタンスを作る

Lesson 8 / Chapter 2

---

## クラスは設計図、`new` で実体を作る

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

$taro = new User();
```

- 設計図 (クラス) はそのままでは使えない
- `new User()` で「設計図に従って 1 つ実体を作る」
- 作ったものは変数に入れて持ち歩く

`$taro` の中身は「`User` という型の実体 (インスタンス)」。

---

## プロパティに値を入れる

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

$taro = new User();
$taro->name = "太郎";

echo $taro->name . "\n";  // 太郎
```

- `$taro->name = "太郎";` で **このインスタンスの** `name` に値を入れる
- `$taro->name` で取り出す
- 矢印は **`->`** (マイナスと不等号) で、間にスペースは入れない

---

## 同じクラスから何個でも作れる

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

$a = new User();
$a->name = "太郎";

$b = new User();
$b->name = "花子";

echo $a->name . "\n";  // 太郎
echo $b->name . "\n";  // 花子
```

- `new User()` を呼ぶたびに **別の実体** が作られる
- `$a` と `$b` は中身が独立している (一方を変えても他方は影響しない)

---

## インスタンスは設計図ごとに独立している

```php
<?php
$a = new User();
$b = new User();

$a->name = "太郎";
// $b->name には何もしていない

echo $a->name . "\n";  // 太郎
// echo $b->name は「未設定」なので警告 (ch03 で扱う)
```

- 同じクラスから作ったインスタンスでも、**プロパティの中身は別物**
- 「設計図は 1 枚、家は何軒でも建つ」イメージ

---

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

✅ `new クラス名()` でインスタンスを作れる
✅ インスタンスを変数に入れて持ち歩ける
✅ `$obj->prop = 値;` で値を入れて `$obj->prop` で取り出せる
✅ 同じクラスから複数のインスタンスを作ると独立すると言える

→ ドリルへ
