【PHP】Closure(クロージャ)とは?

PHP
Eslo
Eslo

PHPのクロージャについて基本的な概念から応用的な使い方まで解説します!

この記事でわかること
  • Closureの使い方
  • 実務でよく使用されるClosure

PHPのClosure(クロージャ)について解説

PHPのクロージャ(Closure)は、無名関数の一種であり、関数を変数として扱ったり、動的に作成したりすることができます。クロージャは主に関数内で別の関数を作成し、その状態を保持するために使用されます。

PHP: Closure - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites i...

以下では、PHPのクロージャについて基本的な概念から応用的な使い方まで解説します。

クロージャの使い方

1. 基本的な使い方

クロージャはfunctionキーワードを使用して作成されます。以下に基本的な例を示します。

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

echo $greet("Eslo"); // 出力: Hello, Eslo!

このように、無名関数を変数に代入し、それを呼び出すことができます。

2. useキーワードによる変数のキャプチャ

クロージャでは、スコープ外の変数をuseキーワードでキャプチャして使用することができます。

<?php
$message = "World";

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

echo $greet(); // 出力: Hello, World!

注意: useでキャプチャされた変数はデフォルトで値渡し(コピー)されます。変数の値を変更する必要がある場合は、参照渡し(&を使用)を利用します。

<?php
$count = 0;

$increment = function() use (&$count) {
    $count++;
};

$increment();
$increment();

echo $count; // 出力: 2

3. クラス内でのクロージャの使用

クロージャはクラス内でも使用できます。$thisを使用する場合は、クロージャをbindToメソッドでバインドするか、クラスのメソッドとして定義します。

<?php
class Greeter {
    private $greeting = "Hello";

    public function createGreetingClosure($name) {
        return function() use ($name) {
            return "$this->greeting, $name!";
        };
    }
}

$greeter = new Greeter();
$closure = $greeter->createGreetingClosure("Eslo");

echo $closure(); // 出力: Hello, Eslo!

4. 実践的な使用例

コールバック関数としての使用:

クロージャは、配列操作やイベントリスナーなど、コールバック関数としてよく使用されます。

<?php
$numbers = [1, 2, 3, 4, 5];

$squaredNumbers = array_map(function($n) {
    return $n * $n;
}, $numbers);

print_r($squaredNumbers);
// 出力: Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )

カスタムソートが実務でよく使用されます。

カスタムソート:

<?php
$people = [
    ["name" => "Eslo", "age" => 30],
    ["name" => "Alice", "age" => 25],
    ["name" => "Bob", "age" => 35]
];

usort($people, function($a, $b) {
    return $a['age'] <=> $b['age'];
});

print_r($people);

終わりに

PHPのクロージャは、柔軟で強力な機能を提供します。特に、変数のスコープを制御したり、動的な関数を作成したりする場面で役立ちます。基本的な使い方を理解した後は、応用例を試してみて、コードの再利用性や簡潔さを向上させてみましょう。