# ch08 — 標準入力

Source: https://php-school.pages.dev/topics/hello/ch08-input/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: PHPをはじめよう
Level: L1

Reference (official): https://www.php.net/manual/ja/language.basic-syntax.php

## 本文

# ch08 — 標準入力

## 概要

ここまでは出力 (`echo`) ばかりだったが、プログラムが本当に役に立つのは **外から値を受け取って、それに応じて結果を変える** ようになってから。CLI スクリプトで対話的にユーザーから 1 行入力をもらう手段が **`fgets(STDIN)`** で、「名前を入力して挨拶を返す」「2 つの数字を足し算する電卓」のようなミニアプリが書けるようになる。

`fgets(STDIN)` には **2 つの定石** がある。1 つ目は **末尾の改行 `\n` を `trim()` で除去する** こと。ユーザーが Enter を押すとその改行までが入力に含まれ、そのまま `echo` で出すと余計な行が増えたり、`"5\n" === "5"` で比較がズレたりする。2 つ目は **数値として使うときに `(int)` でキャストする** こと。`fgets()` が返すのは常に文字列なので、暗黙の型変換に頼ると `"3a"` のような不正値が黙って 3 として扱われる。明示的に `(int)trim(fgets(STDIN))` と書く形を手癖にしておきたい。

なお Web の世界では **`$_GET` や `$_POST`** で同様の「外から値を受け取る」を行うが、これはブラウザ経由の入力で、本章で扱う CLI の標準入力とは別の仕組みだ。Web 側は後の web トピックで改めて扱うので、ここでは **「CLI ではどう受け取るか」** に集中してよい。

## 学習目標

- `fgets(STDIN)` で 1 行入力を受け取れる
- `trim()` で末尾の改行を取り除ける
- `(int)` で文字列を整数に変換して計算できる

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | 入力された文字列をそのまま出力 |
| 02 | 2 行の整数を読んで合計を出力 |

## 採点

```bash
php scripts/grade.php topics/hello/ch08-input/drill/01-echo-input/
```

## 関連チャプター

- [`ch06-strings`](../ch06-strings/) — 文字列の連結と展開 (このチャプターの前提)
- [`ch07-numbers`](../ch07-numbers/) — 数値の四則演算 (入力を計算に使う)
- [`ch05-variables`](../ch05-variables/) — 受け取った値を変数に入れる

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 1 / Chapter 8
  目的: fgets(STDIN) + trim() で 1 行入力を読み、(int) で数値計算に使えるようにする
  扱わない: 配列入力 (後続章) / 例外処理 / バリデーション
  読み上げ時間目安: 4 分
-->

# 標準入力

Lesson 1 / Chapter 8

---

## 標準入力とは

- ターミナルやファイルから **プログラムに値を渡す** 仕組み
- これまでは `echo` で出すだけだった
- 入力を受け取れると **対話するプログラム** が書ける

実行イメージ:

```
$ echo "太郎" | php hello.php
こんにちは 太郎 さん
```

---

## `fgets(STDIN)` で 1 行読む

```php
<?php
$line = fgets(STDIN);
echo $line;
```

- `STDIN` = 標準入力
- `fgets(STDIN)` で **改行までの 1 行** を読み取る
- 読んだ結果は **文字列** として変数に入る

---

## 改行が残るので `trim()` で取る

```php
<?php
$line = fgets(STDIN);
echo "[" . $line . "]\n";       // 改行残り
echo "[" . trim($line) . "]\n"; // 改行除去
```

入力が `太郎` のとき:

```
[太郎
]
[太郎]
```

- `fgets` は **末尾の改行を含めて** 返す
- `trim()` で改行や前後の空白を取り除く
- **入力を扱う時はほぼ毎回 `trim()` する**

---

## 数値として計算したい時は `(int)` で変換

```php
<?php
$line = fgets(STDIN);
$n = (int) trim($line);
echo $n + 1;
echo "\n";
```

入力が `5` のとき出力は `6`。

- `fgets` で読んだ値は **文字列**
- `"5" + 1` でも一応動くが、明示的に `(int)` で変換する
- `(int)` は「整数に直して」という意味

---

## 複数行の入力を読む

```php
<?php
$a = (int) trim(fgets(STDIN));
$b = (int) trim(fgets(STDIN));
echo ($a + $b) . "\n";
```

入力:

```
3
5
```

出力:

```
8
```

- `fgets(STDIN)` を **入力の行数だけ** 呼ぶ
- 各行を `trim()` して `(int)` で数値化

---

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

✅ `fgets(STDIN)` で 1 行入力を読める
✅ `trim()` で改行を取り除ける
✅ `(int)` で文字列を整数に変換して計算できる
✅ 複数行の入力を順に読める

→ ドリルへ
