16.

PHPの関数

編集

本稿は 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 等のフレームワークでは、関数よりクラスメソッドに分けるのが一般的

関連

編集
Post Share
子ページ
  1. 関数の定義と呼び出し方法
  2. 他ファイルの関数読み込み
  3. 可変長引数
同階層のページ
  1. 基本事項
  2. HTMLへの埋め込み
  3. 変数
  4. 可変変数
  5. 定数
  6. データ型
  7. キャスト
  8. エスケープ文字
  9. 配列
  10. 演算子
  11. 代入の際の注意点
  12. 条件分岐
  13. 繰り返し処理
  14. クラスとインスタンス
  15. コンストラクタ
  16. 関数
  17. スーパーグローバル変数
  18. スコープ
  19. staticについて
  20. yieldについて
  21. ファイルのアップロード方法
  22. DB接続方法
  23. SQL実行方法
  24. カプセル化の具体例
  25. 継承の構文
  26. オーバーライド
  27. ポリモーフィズム(多様性)の具体例
  28. 抽象クラス・メソッドの構文と具体例
  29. GET通信
  30. try catchで全てのエラーを拾う方法