# ch06 — 文字列の連結と展開

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

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

## 本文

# ch06 — 文字列の連結と展開

## 概要

挨拶文に名前を埋め込む、エラーメッセージに変数の中身を差し込む、といった **「固定の文字列と、状況に応じて変わる値を組み合わせる」** 作業はプログラムを書く時間の多くを占める。PHP にはこのために 2 つの方法が用意されていて、両方を使い分けられるようになるとコードがぐっと読みやすくなる。

1 つ目は **`.` (ドット) 演算子による連結** で、`"こんにちは " . $name . " さん"` のように文字列と変数をつなげる。2 つ目は **ダブルクォート文字列内での変数展開** で、`"こんにちは {$name} さん"` のように直接書き込める。シングルクォート `'...'` とダブルクォート `"..."` の違いはここで、**シングルクォートは変数を展開せずそのまま文字として扱う**、ダブルクォートは `$変数` や `\n` のようなエスケープシーケンスを解釈する、というルールだ。**変数を埋め込みたいかどうか** で選ぶのが正しい使い分けになる。

初学者がほぼ全員踏むワナが **日本語の直後で変数が壊れる** という現象。`"こんにちは$nameさん"` と書くと、PHP は `$nameさん` までを 1 つの変数名と誤読しようとする。これを防ぐのが **波括弧で囲む `"{$name}"` の形** で、変数の範囲を明示して日本語と分離できる。なお `<<<EOT` で複数行を書く **ヒアドキュメント** という記法もあるが、本章では扱わない。

## 学習目標

- `.` (ドット) で文字列と変数を連結できる
- ダブルクォート内で `"{$var}"` を使って変数を埋め込める
- 日本語が変数の直後に来るときに **波括弧 `{}` が必要** な理由を言える

## 所要時間

スライド 4 分 + ドリル 3 問 = **15 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | `.` 連結で名前と挨拶をつなげる |
| 02 | `{$var}` で日本語の文中に変数を埋め込む |
| 03 | 1 つの文字列に複数の変数を埋め込む |

## 採点

```bash
php scripts/grade.php topics/hello/ch06-strings/drill/01-concat/
```

## 関連チャプター

- [`ch05-variables`](../ch05-variables/) — 変数の基本 (このチャプターの前提)
- [`ch07-numbers`](../ch07-numbers/) — 数値の四則演算
- [`ch08-input`](../ch08-input/) — 標準入力で受け取った文字列を扱う

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 1 / Chapter 6
  目的: 文字列の連結 (.) と変数展開 ({$var}) を使い分けられる状態にする
  扱わない: sprintf / printf (後の章) / ヒアドキュメント (扱わない)
  読み上げ時間目安: 3 分半〜4 分
  ※ 日本語が変数の直後に来るとき波括弧が必要な点を必ず体感させる
-->

# 文字列の連結と展開

Lesson 1 / Chapter 6

---

## `.` (ドット) で文字列をつなげる

```php
<?php
$name = "太郎";
echo "こんにちは、" . $name . "さん\n";
?>
```

実行結果:

```
こんにちは、太郎さん
```

- 文字列 `"こんにちは、"` と変数 `$name` と文字列 `"さん"` を `.` でつないだ
- ch05 で使った書き方

---

## ダブルクォート内では変数がそのまま展開される

```php
<?php
$name = "太郎";
echo "こんにちは、$name さん\n";
?>
```

実行結果:

```
こんにちは、太郎 さん
```

- ダブルクォート `"..."` の中に書いた `$name` は **中身に置き換わる**
- 連結 `.` を書かなくて済む
- ただし変数の **直後に半角スペースや記号** がないと、どこまでが変数名か分からなくなる

---

## 日本語が直後に来ると変数名と誤解される

```php
<?php
$name = "太郎";
echo "こんにちは、$nameさん\n";   // ← うまく動かない
?>
```

- PHP は `$nameさん` 全体を変数名と思って探そうとする
- 結果: `Warning: Undefined variable $nameさん` などのエラー
- 日本語は変数名に使えないが、PHP は **空白や記号が来るまでが変数名** とみなす

---

## 解決: 波括弧 `{}` で囲む

```php
<?php
$name = "太郎";
echo "こんにちは、{$name}さん\n";
?>
```

実行結果:

```
こんにちは、太郎さん
```

- `{$name}` のように **波括弧で囲む** と「ここまでが変数」とハッキリ伝わる
- 日本語の直前・直後に変数を置くときは **必ず `{}` を付ける**
- 半角スペースや記号で区切れているなら `{}` は省略可

---

## 複数の変数も同じように埋め込める

```php
<?php
$name = "花子";
$age = 20;
echo "{$name}さんは{$age}歳です\n";
?>
```

実行結果:

```
花子さんは20歳です
```

- 1 つの文字列に複数の `{$var}` を入れられる
- 連結 `.` を何度も書くより読みやすい

---

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

✅ `.` で文字列と変数を連結できる
✅ ダブルクォート内で `"{$name}"` を使って変数を展開できる
✅ 日本語の直前・直後では `{}` が必要だと分かる
✅ 複数の変数を 1 つの文字列に埋め込める

→ ドリルへ
