【PHP】レッスン3-06:無名関数とアロー関数を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:無名関数とアロー関数

この記事の練習問題を解くために必要な知識:
ビルトイン関数関数の定義と呼出し関数の戻り値デフォルト引数とキーワード引数関数の型付け無名関数とアロー関数スコープ

<<前のページ PHP記事一覧 次のページ>>

PHPの「無名関数とアロー関数」とは

この章ではPHPにおける「無名関数とアロー関数」の意味や使い方を学習します。用語の解説が不要な方はここをクリックして練習問題へ飛びましょう。




PHPの関数には、これまで説明してきた「名前を持つ関数」以外に「無名関数」と「アロー関数」というものがあります。

これらの関数は一時的に関数を定義し、その場で処理を実行する際に便利です。

本記事では無名関数とアロー関数の基本的な使い方と違いについて解説します。

PHPの無名関数とは?

無名関数(Anonymous Function)は、名前を持たない関数です。

PHPではfunctionキーワードを使用してその場で関数を定義し、変数に代入することで利用できます。

無名関数は一度しか使わない関数やコールバック関数としてよく使われます。

$変数 = function( 引数 ) { 
    処理; 
};

無名関数の使用例

以下の例では無名関数を使って、引数に与えた数字を2倍にする処理を行っています。

<?php
// 無名関数を定義
$double = function($n) { //仮引数$nを受け取る無名関数を定義し、変数$doubleに代入
    return $n * 2;
};

// 無名関数を呼び出す
echo $double(5) . PHP_EOL; // 結果: 10
echo $double(10) . PHP_EOL; // 結果: 20
  • 無名関数はfunction($n) { return $n * 2; }の部分で定義されています。
  • $doubleという変数に関数が代入され、関数名の代わりに$doubleを使って関数を呼び出します。

PHPのアロー関数とは?

アロー関数(Arrow Function)は、PHP 7.4以降で導入された簡潔な無名関数の記法です。

fnキーワードを使い、短い処理を簡単に書くことができます。

$変数 = fn ( 引数 ) => 処理;

アロー関数は1行の処理のみを記述する場合に便利です。

アロー関数の使用例

以下はアロー関数を使って、引数に与えた数字を3倍にする処理を行っています。

<?php
// アロー関数を定義
$triple = fn($n) => $n * 3; // 仮引数$nを受け取るアロー関数を定義し、変数$tripleに代入

// アロー関数を呼び出す
echo $triple(5) . PHP_EOL;  // 結果: 15
echo $triple(10) . PHP_EOL; // 結果: 30
  • fn($n) => $n * 3はアロー関数です。簡潔に1行で書かれています。
  • $triple変数にアロー関数が代入されており、$triple(5)のように呼び出しています。

まとめ

無名関数は柔軟な定義ができ、複数行の処理を書く場合に適しています。

一方、アロー関数はシンプルな1行の処理に向いており、記述が簡潔になります。

状況に応じて無名関数とアロー関数を使い分けることで、コードを効率的に書くことができます。

無名関数とアロー関数の練習問題:シンプルな関数の使い方を理解しよう

数値を処理するプログラムを作成しましょう。

入力された数値を使い、無名関数でその数値を2倍にし、アロー関数でその数値を3倍にします。

結果とともに数値の正負も判定して画面に表示してください。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • ユーザーから1つの整数を入力として受け取ること。
  • 無名関数を使用して入力された数値を2倍にし、その結果を表示すること。
  • アロー関数を使用して入力された数値を3倍にし、その結果を表示すること。
  • if文を使って、入力された数値が正の数か負の数か、または0かを判定し、その結果を表示すること。
  • 出力はすべて日本語で表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

数値を入力してください: 
5
入力した数値の2倍: 10
入力した数値の3倍: 15
入力した数値は正の数です。

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:「数値を入力してください: 」を出力
2:標準入力から値を取得し、整数型に変換して変数$inputに代入
3:無名関数を定義し、変数$doubleに代入
  □ 引数$nを受け取り、$nに2を掛けた結果を返す
4:アロー関数を定義し、変数$tripleに代入
  □ 引数$nを受け取り、$nに3を掛けた結果を返す
5:「入力した数値の2倍: 」と無名関数の結果を出力
6:「入力した数値の3倍: 」とアロー関数の結果を出力
7:if文で入力値が正の数か判定
  □ 真の場合、「入力した数値は正の数です。」を出力
  □ else if文で入力値が負の数か判定
  □ □ 真の場合、「入力した数値は負の数です。」を出力
  □ else文
  □ □ 「入力した数値は0です。」を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

<?php

// ユーザーに数値の入力を求める
echo "数値を入力してください: " . PHP_EOL;
$input = (int) trim(fgets(STDIN)); // 入力された値を数値に変換

/*【穴埋め問題1】 
ここで無名関数を定義し、引数に与えた数値を2倍にして返す関数を作成し、変数$doubleに代入するコードを書いてください。 
*/

/*【穴埋め問題2】 
ここでアロー関数を定義し、引数に与えた数値を3倍にして返す関数を作成し、変数$tripleに代入するコードを書いてください。 
*/

// 無名関数とアロー関数を呼び出し、結果を表示する
echo "入力した数値の2倍: " . $double($input) . PHP_EOL; // 無名関数の結果
echo "入力した数値の3倍: " . $triple($input) . PHP_EOL; // アロー関数の結果

// if文を使って入力値が正しいか確認する
if ($input > 0) {
    echo "入力した数値は正の数です。" . PHP_EOL;
} else if ($input < 0) {
    echo "入力した数値は負の数です。" . PHP_EOL;
} else {
    echo "入力した数値は0です。" . PHP_EOL;
}

以上がこの問題の穴埋めコードです。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

<?php

// ユーザーに数値の入力を求める
echo "数値を入力してください: " . PHP_EOL;
$input = (int) trim(fgets(STDIN)); // 入力された値を数値に変換

// 無名関数を使用して、数値を2倍にする関数を定義する
$double = function($n) {
    // 無名関数: 引数の数値を2倍にして返す
    return $n * 2;
};

// アロー関数を使用して、数値を3倍にする関数を定義する
$triple = fn($n) => $n * 3; // アロー関数: 引数の数値を3倍にして返す

// 無名関数とアロー関数を呼び出し、結果を表示する
echo "入力した数値の2倍: " . $double($input) . PHP_EOL; // 無名関数の結果
echo "入力した数値の3倍: " . $triple($input) . PHP_EOL; // アロー関数の結果

// if文を使って入力値が正しいか確認する
if ($input > 0) {
    echo "入力した数値は正の数です。" . PHP_EOL;
} else if ($input < 0) {
    echo "入力した数値は負の数です。" . PHP_EOL;
} else {
    echo "入力した数値は0です。" . PHP_EOL;
}

正解コードの解説

今回のコードでは、無名関数とアロー関数を使って入力された数値を2倍・3倍にし、数値の正負を判定する処理を行っています。

それではコードをブロックごとに分割し、詳しく解説していきましょう。

入力処理

echo "数値を入力してください: " . PHP_EOL;
$input = (int) trim(fgets(STDIN));
  • echo:画面にメッセージを表示します。初心者の方は「数値を入力してください:」と出力される部分を確認してください。
  • fgets(STDIN):ユーザーの入力を受け取るための関数です。STDINは標準入力を意味し、コンソールからデータを受け取る際に使います。
  • (int):入力された文字列を整数型に変換するキャスト操作です。数値のみを扱うために必要です。
  • trim():入力の前後にある余分な空白や改行を取り除く関数です。

無名関数(匿名関数)の定義

  • 無名関数:名前を持たない関数です。変数$doubleに関数を代入することで、その変数を使って関数を呼び出せます。
  • function($n)functionキーワードを使って関数を定義し、引数$nを受け取ります。
  • return $n * 2;:引数$nに2を掛けた値を返します。
  • ポイント:無名関数は一時的に利用する関数や、関数名を必要としない場面で使われます。

アロー関数の定義

$triple = fn($n) => $n * 3;
  • アロー関数:PHP 7.4から追加された簡潔な関数記法です。fnキーワードを使い、無名関数を1行で書けます。
  • fn($n):引数$nを受け取ります。
  • => $n * 3;:引数に3を掛けた結果を返します。
  • ポイント:アロー関数は短い処理に向いており、コードをすっきり書けます。

無名関数とアロー関数の実行

echo "入力した数値の2倍: " . $double($input) . PHP_EOL;
echo "入力した数値の3倍: " . $triple($input) . PHP_EOL;
  • $double($input):無名関数を呼び出し、入力値を2倍にします。
  • $triple($input):アロー関数を呼び出し、入力値を3倍にします。

if文による数値の正負判定

if ($input > 0) {
    echo "入力した数値は正の数です。" . PHP_EOL;
} else if ($input < 0) {
    echo "入力した数値は負の数です。" . PHP_EOL;
} else {
    echo "入力した数値は0です。" . PHP_EOL;
}

if文:条件分岐を行う文法です。入力値の状態(正、負、0)に応じて異なるメッセージを表示します。

まとめ

このコードでは無名関数とアロー関数を使って数値を2倍・3倍にする方法を学びました。

  • 無名関数は柔軟に使える一方、コードが少し長くなります。
  • アロー関数は短く簡潔に書けるため、シンプルな処理に向いています。

関数の使い方をしっかり理解し、次は複雑な処理にもチャレンジしてみましょう!

<<前のページ PHP記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    PHPのテキスト&問題集トップへ戻る
    トップページへ戻る