# ch03 — プロパティを読み書きする

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

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

## 本文

# ch03 — プロパティを読み書きする

## 概要

プロパティ (property) は **インスタンスが保持するデータの場所** で、PHP では `$obj->prop` の形でアクセスする。`->` (アロー) はオブジェクトの中身を指す演算子で、`$user->name = "太郎"` で代入、`echo $user->name;` で取得できる。1 つのインスタンスに複数のプロパティを定義しておけば、`name` `age` `city` のような関連データをひとまとまりで保持できる。

プロパティへのアクセスは **左辺と右辺の両方で使える**。`$user->age = 20;` (左辺で代入) と `echo $user->age;` (右辺で取得) は同じ記法で、これは通常の変数 `$x` と同じリズムで読み書きできるということ。インスタンスごとにプロパティは独立しているので、`$a->name` と `$b->name` を別々に設定しても互いに影響しない。

このチャプターでは `public` プロパティを使った素朴な代入と取得だけを扱い、外から自由に書き換えられる状態にしている。実務では「外から書き換えてほしくないデータ」を `private` にして getter / setter 越しに公開する設計が一般的だが、それは ch07 (アクセス修飾子) で扱う。まずは「インスタンスはデータを持てる」「プロパティは `->` で出し入れする」の感覚をしっかり付ける。

## 学習目標

- `$obj->prop = 値;` で値を入れられる
- `$obj->prop` で値を取り出せる
- 1 つのインスタンスに複数のプロパティを設定できる

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | `name` と `age` を設定して両方を出力 |
| 02 | `name` / `age` / `city` の 3 プロパティを設定して出力 |

## 採点

```bash
php scripts/grade.php topics/class/ch03-properties/drill/01-set-get/
```

## 関連チャプター

- [`ch02-new-instance`](../ch02-new-instance/) — インスタンス生成 (前提)
- [`ch04-methods`](../ch04-methods/) — メソッドからプロパティを更新する
- [`ch05-this`](../ch05-this/) — メソッド内から `$this->prop` で触る
- [`ch07-visibility`](../ch07-visibility/) — `private` で外から守る

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 8 / Chapter 3
  目的: $obj->prop の構文でプロパティに値を書き込み・読み出しできるようにする
  扱わない: メソッド (ch04) / $this (ch05) / コンストラクタ (ch06) / 修飾子 (ch07) / 継承・static (L9)
  読み上げ時間目安: 3 分半〜4 分
-->

# プロパティを読み書きする

Lesson 8 / Chapter 3

---

## `$obj->プロパティ名` で読み書きする

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

$u = new User();
$u->name = "太郎";   // 書き込み
$u->age  = 20;

echo $u->name . "\n";  // 読み出し → 太郎
echo $u->age . "\n";   // 読み出し → 20
```

- `=` の左に書けば書き込み
- 式の中に書けば読み出し
- 矢印は **`->`** (間にスペースは入れない)

---

## 複数のプロパティをまとめて設定

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

$b = new Book();
$b->title  = "PHP 入門";
$b->price  = 1200;
$b->author = "山田";
```

- 1 つのインスタンスに、宣言した数だけプロパティを並べられる
- 順番は自由 (ただし「全部を 1 ヶ所にまとめる」のが読みやすい)

---

## 取り出して文字列と連結する

```php
<?php
$u = new User();
$u->name = "太郎";
$u->age  = 20;

echo $u->name . " (" . $u->age . " 歳)\n";
```

実行結果:

```
太郎 (20 歳)
```

- `$u->name` をそのまま `.` で連結できる
- ダブルクォート文字列に埋め込む時は `{$u->name}` と中括弧で囲む

---

## よくあるミス

```php
$u . name = "太郎";    // ❌ ドットではなくアロー
$u->name == "太郎";    // ❌ 比較になっている (= 1 個)
$u -> name = "太郎";   // ⚠️ スペースを空けても動くが慣例違反
```

直したもの:

```php
$u->name = "太郎";
```

- `->` は **マイナス + 大なり** で **スペースなし** が標準

---

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

✅ `$obj->prop = 値;` で値を書き込める
✅ `$obj->prop` で値を読み出せる
✅ 1 つのインスタンスに複数のプロパティを設定できる
✅ プロパティを `.` で連結したり `{$obj->prop}` で展開したりできる

→ ドリルへ
