# ch04 — メソッドを定義して呼ぶ

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

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

## 本文

# ch04 — メソッドを定義して呼ぶ

## 概要

メソッド (method) は **クラスの中に定義された関数** で、そのクラスのインスタンスが「できる動作」を表す。`User` クラスに `greet()` メソッドを書けば、`$user->greet()` の形で呼び出せる。書き方は通常の関数と同じく `function 名前() { ... }` を使い、クラスの `{ }` の中に並べる。データだけ持っていたインスタンスが、これで「振る舞い」も持てるようになる。

メソッドの呼び出しは `インスタンス->メソッド名()` の形で、プロパティ (`->prop`) と同じ `->` を使うが「`()` が付くかどうか」で区別される。`$user->name` はプロパティ、`$user->greet()` はメソッド呼び出しになる。メソッドにも引数を渡せて (`$user->add(5)`)、関数と同じ感覚で値を受け取れる。

このチャプターでは **`$this` をまだ使わない**。プロパティを更新したいときは外から `$user->age = 25;` のように直接代入する形で扱い、メソッドの中身は固定文言の出力や引数の演算結果の出力に留める。「メソッド呼び出しのリズム」を先に体に入れて、次の章 (`$this`) でメソッド内からプロパティを参照するパターンに進む。

## 学習目標

- クラスの `{ }` の中に `function 名前() { ... }` を書ける
- `$obj->method()` でメソッドを呼べる
- メソッドにも引数を渡せる

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | 引数なしの `greet()` メソッドで「こんにちは」と出す |
| 02 | 引数ありの `add(int $n)` メソッドで `age` を更新する |

> `$this` はまだ使わない。プロパティ更新は外から `$obj->age = ...` で行う。`$this` は ch05 で扱う。

## 採点

```bash
php scripts/grade.php topics/class/ch04-methods/drill/01-greet/
```

## 関連チャプター

- [`ch03-properties`](../ch03-properties/) — プロパティの読み書き (前提)
- [`ch05-this`](../ch05-this/) — `$this` でプロパティ参照
- [`ch06-constructor`](../ch06-constructor/) — 初期化メソッド

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 8 / Chapter 4
  目的: クラス内に function を書きメソッドを定義し、$obj->method() で呼べるようにする
  扱わない: $this (ch05) / コンストラクタ (ch06) / 修飾子 (ch07) / 継承・static (L9)
  読み上げ時間目安: 3 分半〜4 分
-->

# メソッドを定義する

Lesson 8 / Chapter 4

---

## メソッドは「クラスの中に書く関数」

```php
<?php
class User {
    public function greet(): void {
        echo "こんにちは\n";
    }
}

$u = new User();
$u->greet();   // → こんにちは
```

- クラスの `{ }` の中に `function 名前() { ... }` を書く
- 関数 (L7) と同じ書き方だが、所属するクラスがある点が違う
- `public` を付けると外から呼べる (ch07 で詳しく)

---

## 呼び出しは `$obj->method()`

```php
<?php
class Book {
    public function show(): void {
        echo "本のメソッドが呼ばれた\n";
    }
}

$b = new Book();
$b->show();
```

- プロパティと同じ `->` を使う
- 末尾に `()` を付ける (引数なしでも省略不可)
- `$obj->method;` のように `()` を忘れるとメソッドが **実行されない**

---

## 引数も渡せる

```php
<?php
class Calc {
    public function add(int $a, int $b): int {
        return $a + $b;
    }
}

$c = new Calc();
echo $c->add(3, 5) . "\n";  // → 8
```

- 関数 (L7) と同じく型を付けられる
- `return` で値を返す
- 戻り値が無い時は `: void` を付ける慣習

---

## 同じクラスから作ったインスタンスはどれも同じメソッドを持つ

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

$a->greet();   // こんにちは
$b->greet();   // こんにちは
```

- メソッドは **設計図に書かれた手順** なので、どのインスタンスから呼んでも同じ振る舞いをする
- インスタンスごとに **動きを変えたい** 時は `$this` を使う (ch05)

---

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

✅ クラス内に `function 名前() { ... }` でメソッドを書ける
✅ `$obj->method()` でメソッドを呼べる
✅ メソッドにも引数と戻り値の型を付けられる
✅ 同じクラスから作ったインスタンスはどれも同じメソッドを持つと言える

→ ドリルへ
