# ch05 — $this でプロパティを参照する

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

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

## 本文

# ch05 — $this でプロパティを参照する

## 概要

`$this` は **「いま動いているメソッドが属しているインスタンス自身」** を指す特別な変数だ。メソッドの中から `$this->name` と書けば、そのメソッドを呼んだインスタンス自身の `name` プロパティを読み書きできる。`$user->greet()` を実行するとき、メソッド `greet` の中の `$this` は `$user` を指し、別の `$another->greet()` のときは `$another` を指す。同じメソッドが、呼ばれたインスタンスに応じて違う値を扱えるようになる仕組みの中心が `$this`。

`$this` を理解すると、メソッドが「自分のデータに基づいて振る舞いを変える」設計ができるようになる。`function greet()` の中で `echo "こんにちは、" . $this->name . "です";` と書いておけば、太郎の `User` を作って呼べば「こんにちは、太郎です」、花子なら「こんにちは、花子です」と、データに応じて結果が変わる。これがオブジェクト指向の典型的な書き方になる。

このチャプターで最頻出のエラーが **「$this 抜け」**。メソッドの中でプロパティを使うつもりで `echo $name;` と書いてしまうと、メソッドのローカル変数 `$name` を探しに行って「未定義」エラーになる。プロパティに触りたいときは必ず `$this->` を前に付ける、というルールを染み込ませるのがこの章のゴール。

## 学習目標

- メソッド内では `$this->prop` で **自分のプロパティ** を読み書きできる
- `$this` は「いま動いているインスタンス自身」を指す
- メソッドの中身がプロパティに依存して変わるパターンが書ける

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | `$this->name` を使った `greet()` で「こんにちは、太郎です」と出力 |

## 採点

```bash
php scripts/grade.php topics/class/ch05-this/drill/01-this-greet/
```

## 関連チャプター

- [`ch04-methods`](../ch04-methods/) — メソッドの定義 (前提)
- [`ch03-properties`](../ch03-properties/) — プロパティの読み書き
- [`ch06-constructor`](../ch06-constructor/) — `$this->prop = $引数;` の初期化
- [`ch07-visibility`](../ch07-visibility/) — `private` を `$this` で触る

## スライド

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

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

# `$this` でプロパティを参照する

Lesson 8 / Chapter 5

---

## メソッドから自分のプロパティを使いたい

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

    public function greet(): void {
        // ここで $name を使いたいが、ただの $name では取れない
        echo "こんにちは、????です\n";
    }
}
```

- メソッドの中で `$name` と書いても、それは **メソッド内のローカル変数** 扱い
- 「いま動いているインスタンスのプロパティ」を使いたい → `$this` を使う

---

## `$this->プロパティ名` で自分のプロパティ

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

    public function greet(): void {
        echo "こんにちは、" . $this->name . "です\n";
    }
}

$u = new User();
$u->name = "太郎";
$u->greet();   // → こんにちは、太郎です
```

- `$this` は **いま動いているインスタンス自身** を指す
- `$this->name` で「このインスタンスの `name` プロパティ」が取れる
- 外から見る時の `$u->name` と同じ感覚で、内側からは `$this->name`

---

## インスタンスごとに動きが変わる

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

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

$a->greet();   // → こんにちは、太郎です
$b->greet();   // → こんにちは、花子です
```

- 同じ `greet()` メソッドを呼んでも、**`$this` が指す相手** が違う
- だから出力も変わる
- これが「インスタンスごとに振る舞いを変える」基本の仕掛け

---

## `$this->` 経由でプロパティに書き込みもできる

```php
<?php
class Counter {
    public int $count;

    public function up(): void {
        $this->count = $this->count + 1;
    }
}

$c = new Counter();
$c->count = 0;
$c->up();
$c->up();
echo $c->count . "\n";   // → 2
```

- `$this->count = ...` で **自分の** プロパティを書き換える
- 「自分の状態を変えるメソッド」が書けるようになった

---

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

✅ メソッド内で `$this->prop` で自分のプロパティを読める
✅ メソッド内で `$this->prop = 値;` で自分のプロパティを書き換えられる
✅ 同じメソッドでも `$this` が違えば動きが変わると言える
✅ 「外から `$obj->prop`」と「内から `$this->prop`」が対応すると言える

→ ドリルへ
