PHPの関数型プログラミングの基礎をやさしく解説!初心者でもわかる書き方と考え方
生徒
「関数型プログラミングって聞いたことあるけど、PHPでもできるんですか?」
先生
「はい、PHPでも関数型プログラミングを取り入れることができますよ。最近のPHPは、関数を変数のように扱ったり、配列を一気に処理する機能が充実してきています。」
生徒
「でも関数型ってむずかしそうなイメージがあります……」
先生
「たしかに最初は聞きなれない用語が出てきますが、PHPでよく使うarray_mapやarray_filterも関数型プログラミングの一種なんです。今日はやさしく解説していきましょう!」
1. 関数型プログラミングとは?仕組みとメリットを解説
関数型プログラミングとは、一言でいうと「関数(function)」を部品のように組み合わせて、一つの大きなプログラムを作る考え方のことです。プログラミングにおける関数とは、「何かを入れると、決まった計算をして結果を返してくれる魔法の箱」のようなものだとイメージしてください。
この考え方の最大の特徴は、「データの状態を勝手に書き換えない」というルールにあります。これを専門用語で「参照透過性」や「副作用を避ける」と呼びますが、未経験の方には少し難しいですよね。簡単に言うと、「同じデータを入れれば、いつでも、何度でも、必ず同じ結果が返ってくる」という安心設計のことです。
「野菜を切る」という関数があるとします。
- 一般的な書き方:まな板の上の野菜を直接切り、元の状態(丸ごとの野菜)を消してしまう。
- 関数型の書き方:丸ごとの野菜はそのままに、新しく「切られた状態の野菜」をトレイに用意する。
例えば、簡単な計算を関数型っぽく書くと以下のようになります。
// 入力した数値を3倍にして返すだけのシンプルな関数
function triple($number) {
return $number * 3;
}
$input = 10;
$output = triple($input); // $input(10)は変わらず、新しい結果(30)が作られる
echo $output; // 30
このように、一つ一つの処理を「入力を加工して新しい結果を出す」という独立したパーツに分けることで、コードが整理され、後から見返したときや複数人で開発するときに、非常に理解しやすいプログラムになります。
2. PHPの関数を変数として使う(無名関数・クロージャ)
PHPでは、作成した関数に名前を付けず、そのまま「変数」の中に代入して持ち運ぶことができます。これを無名関数(または匿名関数、クロージャ)と呼びます。
通常、関数は「名前を呼んで実行するもの」ですが、変数に入れることで「必要な時だけ、その変数を使って処理を呼び出す」といった柔軟な使い方が可能になります。プログラミング未経験の方でも、まずは「便利な処理を箱(変数)の中にしまっておくイメージ」で捉えれば大丈夫です。
() を付けるのがルールです。
// 「こんにちは」と挨拶する処理を変数 $greet に代入
$greet = function($name) {
return "こんにちは、" . $name . "さん!";
};
// 変数名を使って、中の関数を呼び出す
echo $greet("田中"); // 実行結果:こんにちは、田中さん!
この書き方のメリットは、コードをシンプルに保てることです。一度しか使わないようなちょっとした処理をわざわざ独立した関数として定義せず、変数としてサッと用意できるため、読みやすくメンテナンス性の高いプログラムを書くための第一歩となります。
3. 配列操作の定番:array_map関数の使い方
PHPでプログラミングをしていると、「リストにある数字をすべて2倍にしたい」「名前のリスト全員に『様』をつけたい」といった、データの一括処理が必要な場面がよくあります。そんな時に便利なのがarray_map(アレイ・マップ)関数です。
array_mapは、「配列のすべての要素に対して、指定したルール(関数)を適用して新しい配列を作る」という役割を持っています。初心者の方がつまずきやすい「foreach文による繰り返し処理」を、よりシンプルで読みやすいコードに書き換えることができるのが最大のメリットです。
// 1. 元になる数字のリスト(配列)を用意します
$numbers = [1, 2, 3, 4, 5];
// 2. array_mapを使って、すべての数字を2倍にする処理を行います
// array_map(実行したい処理, 対象の配列) という書き方をします
$double = array_map(function($n) {
return $n * 2; // ここで「2倍にする」というルールを決めています
}, $numbers);
// 3. 結果を表示します
print_r($double);
Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10
)
このコードでは、元の$numbersという箱の中身を一つずつ取り出し、2倍にしてから新しい箱($double)に入れ直しています。プログラミング未経験の方でも、「配列全体に同じ魔法をかける関数」とイメージすると分かりやすいでしょう。コードがスッキリするため、保守性が高くミスが少ないプログラムを書くための第一歩として非常に重要なテクニックです。
4. 条件で選ぶ:array_filter
array_filterは、配列の中から条件に合ったものだけを取り出します。たとえば、偶数だけを選ぶときはこうします。
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_filter($numbers, function($n) {
return $n % 2 === 0;
});
print_r($even);
Array
(
[1] => 2
[3] => 4
[5] => 6
)
このように、array_filterで条件に合う要素だけを抜き出すことができます。
5. 複数の関数をつなげる:関数の合成
関数型プログラミングでは「関数をつなげる(合成する)」という考え方も大事です。たとえば「2倍して、それを足す」などの処理を個別の関数にわけて作り、それを順に実行します。
PHPでは明示的な「関数合成」の仕組みはありませんが、関数を複数使うことでそれに近いことができます。
function double($n) {
return $n * 2;
}
function addTen($n) {
return $n + 10;
}
$number = 5;
$result = addTen(double($number));
echo $result; // 20
このように、処理を小さな関数に分けて組み合わせることで、再利用しやすく、わかりやすいコードになります。
6. 変数の値を変えない考え方
関数型プログラミングでは、「一度決めた値を変えない(イミュータブル)」という考え方が重要です。
これは「安全でバグが出にくいコード」にするためです。
PHPでは、配列のようなデータをコピーして新しく作り直すことで、元のデータを壊さずに処理することができます。
7. 初心者がPHPで関数型を学ぶポイント
- 配列に対して
array_mapやarray_filterを使ってみる - 無名関数(function)を変数に代入して使う練習をする
- 小さな処理を関数に分けて、組み合わせる
PHPの関数型プログラミングを使えば、よりシンプルでわかりやすいプログラムが書けるようになります。
まとめ
この記事では、PHPで関数型プログラミングを実践するための基本的な考え方とテクニックについて、初心者向けにやさしく解説しました。関数型プログラミングというと少し難しく感じるかもしれませんが、実はPHPでもarray_mapやarray_filterといった関数を使うことで、身近に体験することができます。
特に、配列に対して繰り返し処理を行う場面では、foreachなどを使うよりも、array_mapを使う方が見た目にもスッキリしていて、メンテナンス性も向上します。また、特定の条件に合った要素だけを取り出すarray_filterは、非常に強力な道具となりえます。
さらに、無名関数やクロージャを使って、関数を変数に代入する技術も紹介しました。これは、関数型の特徴である「関数を値のように扱う」書き方につながり、柔軟なコーディングスタイルを実現する鍵になります。
処理を小さな関数に分割して、組み合わせて使う関数の合成も大切な考え方のひとつです。これは、PHPだけでなく多くの言語でプログラミングの質を上げるための重要な手法です。
実際のPHPプログラムで、以下のように複数の関数を組み合わせて処理することもできます。
function square($x) {
return $x * $x;
}
function minusOne($x) {
return $x - 1;
}
$start = 4;
$result = square(minusOne($start)); // (4 - 1)^2 = 9
echo $result;
このように、関数型の発想を活かしてコードを書くことで、「可読性が高く」「バグが起きにくい」安全なプログラムを作ることができるようになります。
最後に、関数型プログラミングの大事なポイントとして「副作用を避ける」「イミュータブルな考え方を意識する」ことが挙げられます。PHPはオブジェクト指向の側面も強い言語ですが、関数型のスタイルをうまく取り入れることで、よりモダンでスケーラブルなコードが書けるようになるでしょう。
はじめのうちは難しく感じるかもしれませんが、少しずつ試して慣れていくことで、必ず成長につながります。まずは、array_mapや無名関数から挑戦してみてください。
生徒
「関数型プログラミングって聞いて難しそうだと思ってたけど、array_mapやarray_filterってもう使ってました!」
先生
「そうですね。PHPでは関数型の考え方が意外と身近なんです。無名関数も一度使ってみると、その便利さが実感できると思いますよ。」
生徒
「関数を変数みたいに代入できるのも新鮮でした。これで柔軟に処理を組み立てられるようになりそうです!」
先生
「はい、小さな関数を組み合わせるのは再利用にもつながりますし、コードも読みやすくなります。ぜひ日々のコードで取り入れてみてくださいね。」
生徒
「まずは、array_mapから実際に使って慣れていこうと思います!」