MENU

【PHP】Lesson3-6:無名関数とアロー関数の違いと使い方をマスターしよう

tggaa478@yahoo.co.jp

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

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

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

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数編

 ・Lesson3-1:ビルトイン関数を理解しよう
 ・Lesson3-2:関数の基本を理解しよう
 ・Lesson3-3:関数の戻り値を理解しよう
 ・Lesson3-4:デフォルト引数とキーワード引数を理解しよう
 ・Lesson3-5:関数の型付けを理解しよう
 ・Lesson3-6:無名関数とアロー関数を理解しよう ◁今回はココ
 ・Lesson3-7:スコープを理解しよう
 ・確認問題3-1:石取りゲームを作ろう
 ・確認問題3-2:丁半賭博ゲームを作ろう
 ・確認問題3-3:モンスターとのバトルゲームを作ろう
Lesson4:データ構造編
Lesson5:クラス

<<前のページ

学習記事一覧

次のページ>>

無名関数とは?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)のように呼び出しています。

演習問題|無名関数とアロー関数の基本を使って数値処理を行おう

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

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

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

この演習の要件

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

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

ただし、以下のような実行結果となること。

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

解き方のヒント

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

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

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

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

Q
ヒント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;
}

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

演習問題の答え合わせ

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
<?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;
}
Q
正解コードの解説

コードをブロックごとに分割して解説します。

入力処理

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

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

$double = function($n) {
    // 無名関数: 引数の数値を2倍にして返す
    return $n * 2;
};
  • 無名関数:名前を持たない関数です。変数$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学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました