この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:atom
更新日時:2026-05-13 09:14:28

タイトル: 関数

本稿は PHP の関数に関する記事です。関数とは、処理のまとまりに名前を付けて再利用できるようにしたブロックのことです。引数を受け取り、戻り値を返すことができます。

関数定義の基本

<?php
function add($a, $b) {
    return $a + $b;
}

echo add(2, 3); // 5

関数定義の文法要素

要素役割
function 名(...)関数を宣言
引数関数に渡す値 (型宣言・既定値が可能)
return戻り値を返す。書かなければ null
戻り値型: int: ?string 等で宣言
スコープ関数内は独自のローカルスコープ

型宣言 (PHP 7+)

function greet(string $name, int $times = 1): string {
    return str_repeat("Hello, $name. ", $times);
}

// nullable
function findUser(?int $id): ?User {
    if ($id === null) return null;
    // ...
}

引数の主な機能

機能
既定値function f($x = 10) { ... }
型宣言function f(int $x): int { ... }
nullable 型function f(?string $x) { ... }
参照渡しfunction f(&$x) { $x = 1; }
可変長引数function f(...$args) { ... }
名前付き引数 (PHP 8+)f(name: "Taro", age: 20)
Union 型 (PHP 8+)function f(int|string $x) { ... }
readonly プロパティ (PHP 8.1+)コンストラクタで初期化のみ可

関数の種類

種類説明
ユーザ定義関数自分で書く関数
組み込み関数PHP 標準 (strlenarray_map 等)
無名関数 (クロージャ)$f = function($x) { return $x * 2; };
アロー関数 (PHP 7.4+)$f = fn($x) => $x * 2;
メソッドクラス内に定義する関数
静的メソッドClassName::method() で呼ぶ

無名関数とアロー関数

// 無名関数 (use で外部変数を取り込む)
$rate = 1.1;
$tax = function($price) use ($rate) { return $price * $rate; };

// アロー関数 (PHP 7.4+) 外部変数を自動キャプチャ
$tax = fn($price) => $price * $rate;

echo $tax(1000); // 1100

高階関数 (関数を引数に)

$nums = [1, 2, 3, 4, 5];

$doubled = array_map(fn($x) => $x * 2, $nums);
$even    = array_filter($nums, fn($x) => $x % 2 === 0);
$sum     = array_reduce($nums, fn($acc, $x) => $acc + $x, 0);

スコープのルール

  • 関数内で宣言した変数はローカルスコープ。関数外には影響しない
  • 関数外の変数を関数内で使うには global や引数経由が必要 (global はアンチパターン)
  • 無名関数では use で外部変数を取り込む。アロー関数は自動でクロージャ
  • クラスメソッド内では $this が使える (静的メソッド除く)

戻り値の活用

  • 早期 return でネストを浅く保つ
  • 例外を投げる: throw new InvalidArgumentException("...")
  • 複数値は連想配列またはクラスで返す
  • PHP 8.0+ の match 式で値を返すスタイルが書きやすい

命名と設計の原則

  • 動詞 + 目的語の命名: fetchUser()calculateTax()
  • 1 つの関数は1 つの責務に絞る
  • 副作用 (DB 書込・ファイル書込) は関数名で明示する (savedelete)
  • 引数は多くて 3〜4 個。多いなら配列やオブジェクトにまとめる
  • PHP の標準ライブラリ関数名に紛れない命名を心がける

注意点

  • 関数名は大文字小文字を区別しないが、定義時の表記に統一する
  • 古い PHP のマジック引数 (func_get_args) より、可変長引数 (...args) を使う
  • クロージャを大量に作るとメモリを食う。必要なら名前付き関数として分離
  • PHP 8 では非推奨 / 削除された関数が増えている。古いコードの移行に注意
  • Laravel / Symfony 等のフレームワークでは、関数よりクラスメソッドに分けるのが一般的

関連