関数
関数定義・引数・戻り値・スコープ
処理を function に切り出して 名前を付けて呼び出す ことを学ぶトピック。コードを部品化する第一歩。
このトピックで身につくこと
- 処理に名前を付けて、何度でも呼び出せる
- 同じ処理を 1 箇所にまとめてメンテしやすくできる
- 引数で値を渡し、戻り値で結果を受け取る設計ができる
- 型宣言を使って「期待する型」をコードで宣言できる
- 配列を入力にした関数 (合計・抽出・写像) を書ける
前提知識の要点
このトピックを始めるのに必要な部分だけをここで圧縮しておく。他のトピックの README を読み返さずに function を単独で開始できる ようにする。
1. echo / 変数
<?php
$name = "太郎";
echo "こんにちは、{$name}さん\n";- 変数展開はダブルクォート
"..."の中で{$var}の形
2. 数値・文字列の基本
$a = 3;
$b = 5;
echo $a + $b; // 8
echo "合計: " . ($a + $b); // 合計: 83. 条件分岐
if ($score >= 80) {
echo "合格\n";
} else {
echo "不合格\n";
}4. 配列の基本
$nums = [1, 2, 3, 4];
$sum = 0;
foreach ($nums as $v) {
$sum += $v;
}
echo $sum; // 10- ch06 で「配列を関数に渡す / 関数から配列を返す」を扱うので、ここまで思い出せれば OK
5. 標準入力
$line = trim(fgets(STDIN));
$n = (int)$line; // 数値として扱いたければ (int) でキャスト6. 型のイメージ
PHP は型を明示しなくても動くが、ch05 で 型宣言 を扱う。最低限の型名だけ押さえておく:
| 型名 | 例 |
|---|---|
int |
整数 (5) |
float |
小数 (3.14) |
string |
文字列 ("hello") |
bool |
真偽値 (true / false) |
array |
配列 ([1, 2, 3]) |
ここまで読めば ch01 から始められる。
chapter 一覧
| # | chapter | 内容 | 学習目標 |
|---|---|---|---|
| 1 | ch01-define-call/ |
関数を定義して呼び出す | function 名前() { ... } を書いて呼び出せる |
| 2 | ch02-arguments/ |
引数を受け取る | 関数に値を渡せる (1〜複数引数) |
| 3 | ch03-return/ |
return で戻り値を返す |
関数の結果を呼び出し元で受け取れる |
| 4 | ch04-default-args/ |
デフォルト引数 | 引数を省略可能にできる |
| 5 | ch05-type-hints/ |
型宣言 | 引数と戻り値に型を書ける |
| 6 | ch06-array-arg/ |
配列を引数に取る / 返す | 配列を渡して処理結果の配列を受け取れる |
合計 6 chapter / 15 drill / 所要 約 1.5 時間 程度。
進め方
- 各 chapter の
slide.mdを読む (3〜4 分) drill/配下の問題を順番に解く- 採点:
php scripts/grade.php topics/function/<chapter>/drill/<drill>/
つまづきポイント
| 症状 | 多くの原因 |
|---|---|
Call to undefined function |
関数定義より 前 で呼び出している (※ 通常は上下どちらでも動くがファイル分割時は注意) / スペルミス |
| 何も出力されない | return した値を echo していない (return は 画面に出さない、値を呼び出し元に渡すだけ) |
Undefined variable が関数の中で出る |
関数の外の変数は そのままでは関数内から見えない → 引数で渡す |
引数の型エラー (TypeError) |
function add(int $a) のように型宣言した関数に文字列を渡している → キャストする or 型を緩める |
| デフォルト引数の順序エラー | デフォルト値付き引数は 必ず後ろ に書く (function f($a, $b = 0) は OK、function f($a = 0, $b) は NG) |
| 配列を渡したら元の配列が変わった/変わらない | デフォルトでは 値渡し (関数内の変更は呼び出し元に影響しない) / 元配列を書き換えたいなら &$arr (参照渡し) |
関連トピック
| トピック | 関係 |
|---|---|
| array-multi | 多次元配列を引数・戻り値で扱うときの組み合わせ |
| class | 関数とデータを一緒にまとめる「クラス」へ発展する |
| exception | 不正な引数を throw で構造的に扱う |
トピックを並列で参照する全体地図は TOPICS_INDEX.md にある。
案件 (dojo_map.tsv) での参照
topic_slug chapter_dir
function topics/function/ch01-define-call
function topics/function/ch03-return
function topics/function/ch05-type-hints
...
slug function で参照可。07-function / function どちらの path でもアクセスできる (シンボリックリンク)。
このレッスンの章
スクール現場で詰まる「よくある落とし穴」
公式マニュアルには書かれていないけれど、講師として受講生がよくハマるポイントを並べました。
-
関数の中から外の変数が見えない
PHPの変数スコープは関数で完全に区切られる。外の変数を使うには引数で渡すか `global $x`(非推奨)
-
引数の順序を間違える
PHP 8.0+ なら名前付き引数 `func(name: "x", age: 20)` が使える。順序ミスを防げる
-
戻り値の型を書き忘れる
`function add(int $a, int $b): int { return $a + $b; }` のように型を書くと IDE 補完が効いて事故が減る