「関数をもっと柔軟に使いたい」「関数を引数として渡せるの?」
PHP入門を終えた方が次に知っておきたいのが 高階関数(higher-order function) です。この記事では、PHPで関数を引数や戻り値として扱う方法を、無名関数(クロージャ)と組み合わせてわかりやすく解説します。これを理解すれば、コードがもっとシンプルで表現力豊かになります。
高階関数とは何か?
高階関数とは、関数を引数に受け取ったり、関数を戻り値として返す関数のことです。
たとえば「データを加工する処理を受け取り、それを別の関数の中で実行する」イメージです。
PHPで高階関数は使えるのか?
結論:はい、使えます。
PHPでは関数や無名関数を「第一級オブジェクト」として扱えるため、変数に代入したり、引数・戻り値にできます。
無名関数(クロージャ)の基本
無名関数とは名前を持たない関数のことです。
PHPでは function
キーワードで定義できます。
$double = function($x) {
return $x * 2;
};
echo $double(5); // 出力: 10
高階関数の使い方
関数を引数として渡す
function execute($callback, $value) {
return $callback($value);
}
echo execute('strtoupper', 'hello');
// 出力: HELLO
関数を戻り値として返す
function createAdder($n) {
return function($x) use ($n) {
return $x + $n;
};
}
$addFive = createAdder(5);
echo $addFive(10); // 出力: 15
無名関数を組み合わせる
function applyTwice($func, $value) {
return $func($func($value));
}
$result = applyTwice(function($x) {
return $x * 2;
}, 3);
echo $result; // 出力: 12
よく使う高階関数の例
PHPの標準関数の中にも高階関数があります。
array_map()
: 配列の各要素に関数を適用array_filter()
: 条件を満たす要素だけ残すusort()
: 独自ルールで配列をソート
array_map()
のサンプル
$nums = [1, 2, 3, 4];
$result = array_map(function($n) {
return $n * 2;
}, $nums);
print_r($result); // [2, 4, 6, 8]
array_filter()
のサンプル
偶数だけを残す
<?php
$numbers = [1, 2, 3, 4, 5, 6];
$evenNumbers = array_filter($numbers, function($n) {
return $n % 2 === 0;
});
print_r($evenNumbers);
// 出力: Array ( [1] => 2 [3] => 4 [5] => 6 )
配列のキー(index)は保持されます。連番にしたいときは array_values()
を使います。
$evenNumbers = array_values($evenNumbers);
print_r($evenNumbers);
// 出力: Array ( [0] => 2 [1] => 4 [2] => 6 )
usort()
のサンプル
usort()
は、配列を ユーザー定義の比較関数 を使って並べ替える関数です。
「文字の長さ」順にソート
<?php
$words = ["apple", "kiwi", "banana", "cherry"];
usort($words, function($a, $b) {
return strlen($a) <=> strlen($b);
});
print_r($words);
// 出力: Array ( [0] => kiwi [1] => apple [2] => cherry [3] => banana )
ここでは「宇宙船演算子 <=>
」を使って、文字数が短い順にソートしています。
配列の連想配列を特定キーでソート
<?php
$users = [
["name" => "Taro", "age" => 25],
["name" => "Hanako", "age" => 20],
["name" => "Ken", "age" => 30]
];
usort($users, function($a, $b) {
return $a['age'] <=> $b['age'];
});
print_r($users);
// 出力: 年齢の昇順に並んだ配列
高階関数を使うメリットと注意点
メリット
- コードが シンプル になる
- 再利用性 が高まる
- 処理を 抽象化 できる
注意点
- 過度に使うと 読みづらくなる
- クロージャの スコープ(変数の有効範囲) に注意が必要
まとめ
- 高階関数とは「関数を引数・戻り値にできる関数」
- PHPでは 無名関数・クロージャ を使って実現可能
array_map
,array_filter
,usort
なども高階関数の代表例
高階関数をマスターすれば、コードがより「モダン」で「表現力豊か」に書けます。まずは array_map
や array_filter
から使ってみましょう!