# ch04 — デフォルト引数

Source: https://php-school.pages.dev/topics/function/ch04-default-args/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 関数
Level: L2

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

## 本文

# ch04 — デフォルト引数

## 概要

デフォルト引数は **「呼び出し側が値を省略したときに自動的に使われる値」** を、関数の定義側で決めておく仕組みだ。`function greet($name, $suffix = "さん")` のように `=` 付きで宣言すると、`greet("太郎")` でも `greet("太郎", "様")` でも呼べるようになる。よく使う既定値を関数側に持たせておけば、呼び出し側のコードが短くなり、後から新しい引数を追加しても既存の呼び出しを壊さずに済む。

PHP の重要なルールは **デフォルト値を持つ引数は必須引数より後ろに並べる** こと。`function f($a = 0, $b)` のように必須引数を後ろに置くと、呼び出し時に `$a` だけ省略する書き方ができなくなって混乱する。「左から必須・右からデフォルト」の順序を守るのが基本になる。

このチャプターで補足として知っておきたいのが PHP 8 の **名前付き引数** だ。`greet(name: "太郎", suffix: "様")` のように名前で渡せば順序に縛られず、デフォルトを途中だけ上書きできる。設計時の選択肢として頭の片隅に置いておき、まずはデフォルト引数を「右から省略可能」のルールで安全に書ける状態を目指す。

## 学習目標

- `function f($x = 10) { ... }` でデフォルト値を指定できる
- 呼び出し側で引数を省略するとデフォルト値が使われる
- デフォルトを持つ引数は必須引数の **後ろ** に並べる

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | `greet($name, $suffix = "さん")` を作る |
| 02 | `multiply($a, $b = 2)` を作る |

## 採点

```bash
php scripts/grade.php topics/function/ch04-default-args/drill/01-greet-default/
```

## 関連チャプター

- [`ch02-arguments`](../ch02-arguments/) — 引数で値を受け取る (前提)
- [`ch03-return`](../ch03-return/) — `return` で値を返す
- [`ch05-type-hints`](../ch05-type-hints/) — 型と組み合わせて宣言する

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 7 / Chapter 4
  目的: function f($x = 既定値) でデフォルト引数を持たせ、呼び出し時に省略できるようにする
  扱わない: 型宣言 (ch05) / 配列引数 (ch06) / 名前付き引数 / クラス (L8)
  読み上げ時間目安: 3 分半〜4 分
-->

# デフォルト引数

Lesson 7 / Chapter 4

---

## 引数を毎回渡すのが冗長な場合がある

```php
<?php
function greet($name, $suffix) {
    echo $name . " " . $suffix . "\n";
}

greet("太郎", "さん");
greet("花子", "さん");
greet("次郎", "さん");
```

- ほぼ毎回 `"さん"` を渡している
- もし「省略したらデフォルトで `"さん"`」にできれば楽
- そのための仕組みが **デフォルト引数**

---

## `$x = 値` で既定値を指定

```php
<?php
function greet($name, $suffix = "さん") {
    echo $name . " " . $suffix . "\n";
}

greet("太郎");          // 太郎 さん
greet("花子", "ちゃん"); // 花子 ちゃん
```

- `$suffix = "さん"` と書くと、省略時にこの値が使われる
- 値を渡せばその値が優先される

---

## デフォルト引数は必須引数の後ろに並べる

```php
<?php
// OK: 必須 → デフォルトの順
function ok($a, $b = 2) { ... }

// NG: デフォルト → 必須 はやらない
function bad($a = 2, $b) { ... }
```

- 必須の引数を前、デフォルト付きを後ろに書くのが基本
- 順番を逆にすると、省略の挙動が直感に反する

---

## 数値のデフォルトも書ける

```php
<?php
function multiply($a, $b = 2) {
    return $a * $b;
}

echo multiply(5) . "\n";    // 10  ($b は 2)
echo multiply(5, 3) . "\n"; // 15
```

- デフォルト値は文字列・数値・真偽値などが使える
- 関数呼び出しの結果や変数は **デフォルトに使えない** (定数式のみ)

---

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

✅ `$x = 既定値` でデフォルト引数を指定できる
✅ 呼び出し側で省略すると既定値が使われる
✅ 値を渡せば既定値より優先される
✅ デフォルト引数は必須引数の後ろに並べる

→ ドリルへ
