関数

関数定義・引数・戻り値・スコープ

処理を function に切り出して 名前を付けて呼び出す ことを学ぶトピック。コードを部品化する第一歩。

このトピックで身につくこと

  • 処理に名前を付けて、何度でも呼び出せる
  • 同じ処理を 1 箇所にまとめてメンテしやすくできる
  • 引数で値を渡し、戻り値で結果を受け取る設計ができる
  • 型宣言を使って「期待する型」をコードで宣言できる
  • 配列を入力にした関数 (合計・抽出・写像) を書ける

前提知識の要点

このトピックを始めるのに必要な部分だけをここで圧縮しておく。他のトピックの README を読み返さずに function を単独で開始できる ようにする。

1. echo / 変数

<?php
$name = "太郎";
echo "こんにちは、{$name}さん\n";
▶ 3v4l で実行
  • 変数展開はダブルクォート "..." の中で {$var} の形

2. 数値・文字列の基本

$a = 3;
$b = 5;
echo $a + $b;          // 8
echo "合計: " . ($a + $b);  // 合計: 8
▶ 3v4l で実行

3. 条件分岐

if ($score >= 80) {
    echo "合格\n";
} else {
    echo "不合格\n";
}
▶ 3v4l で実行

4. 配列の基本

$nums = [1, 2, 3, 4];
$sum = 0;
foreach ($nums as $v) {
    $sum += $v;
}
echo $sum;   // 10
▶ 3v4l で実行
  • ch06 で「配列を関数に渡す / 関数から配列を返す」を扱うので、ここまで思い出せれば OK

5. 標準入力

$line = trim(fgets(STDIN));
$n = (int)$line;       // 数値として扱いたければ (int) でキャスト
▶ 3v4l で実行

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 時間 程度。

進め方

  1. 各 chapter の slide.md を読む (3〜4 分)
  2. drill/ 配下の問題を順番に解く
  3. 採点: 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 でもアクセスできる (シンボリックリンク)。

このレッスンの章

  1. ch01 ch01 — 関数を定義して呼び出す
  2. ch02 引数を受け取る
  3. ch03 ch03 — return で戻り値を返す
  4. ch04 ch04 — デフォルト引数
  5. ch05 ch05 — 型宣言
  6. ch06 ch06 — 配列を引数に取る / 配列を返す

スクール現場で詰まる「よくある落とし穴」

公式マニュアルには書かれていないけれど、講師として受講生がよくハマるポイントを並べました。

  1. 関数の中から外の変数が見えない

    PHPの変数スコープは関数で完全に区切られる。外の変数を使うには引数で渡すか `global $x`(非推奨)

  2. 引数の順序を間違える

    PHP 8.0+ なら名前付き引数 `func(name: "x", age: 20)` が使える。順序ミスを防げる

  3. 戻り値の型を書き忘れる

    `function add(int $a, int $b): int { return $a + $b; }` のように型を書くと IDE 補完が効いて事故が減る