PHPでクロージャ(無名関数)を扱う際の注意点

PHPでは、クロージャ(Closure)は無名関数として記述され、変数を内部に取り込んで関数内で使用できます。柔軟な機能である一方、いくつかの制約や注意点があります。

✅ 基本構文

$greet = function($name) {
    return "Hello, $name!";
};

echo $greet("World"); // Hello, World!

🔄 外部変数を使いたいときは use を使う

$prefix = "Hello";

$greet = function($name) use ($prefix) {
    return "$prefix, $name!";
};

use は 無名関数定義の時だけ使える構文です。

use ($var) で 外部変数のスナップショット(値)を関数に閉じ込める。

引用渡しにしたいときは use (&$var)。

❌ 通常の関数では use は使えない

// NG: 構文エラーになる
function greet($name) use ($prefix) {
    return "$prefix, $name!";
}

通常の function 定義では use は使えません。無名関数のみが対象です。

⚠️ グローバル変数を使う場合の注意点

function someFunc() {
    global $shared;
    echo $shared();
}

$shared = function() {
    return "called";
};

someFunc(); // エラー!

このようにすると、someFunc() が $shared を参照する前に グローバルスコープで初期化されていなければエラーになります。

global で参照する関数変数は、関数を呼び出す前に 定義が完了している必要があります。

✅ グローバル関数として明示的に定義する方が安全

クロージャとして定義するより、再利用が多い関数は通常の関数として定義する方が安全かつ明瞭です。

function templatePostContents($post) {
    // 何かの処理
}

✅ クロージャは変数のスコープに依存する

定義したスコープの変数しか使えない(ただし use で持ち込み可能)

グローバル変数として使いたい場合は global を使うか、クロージャ外で準備しておくこと

🧠 よくある落とし穴

未定義の関数呼び出し:クロージャを定義する前に使おうとして undefined function エラー

use の書き忘れ:外部変数を使うつもりが use し忘れて undefined variable

無名関数を値として持っている変数を () で呼ぼうとして null 呼び出しエラー

📌 まとめ

  1. use クロージャ内に外部変数を持ち込むために使う
  2. グローバル変数 呼び出し前に定義されている必要がある
  3. 通常関数との違い use はクロージャ専用、通常関数では使えない
  4. スコープ クロージャは定義時スコープに依存し、外部変数を使うには明示が必要