【PHP】これで分かる関数! – 無名関数 –

PHP

更新履歴

更新日更新者更新内容
2021/8/18JJI・サンプルプログラムの実行結果に画面の画像を追加

無名関数

無名関数はクロージャとも呼ばれ、関数名を定義しなくても関数が使用できる方法です。
関数名を定義しないため、コードを書いたところのみ使用可能なため、使い捨ての関数とも言えると思います。

無名関数はコールバック関数、関数内で値を保持するクロージャとして使用することが多いです。
今までとは異なるコードの書き方になるため、最初は慣れないかもしれません。
普通の関数が使えるようになった後でこの記事を参考にサンプルプログラムを作ることで理解できるようになっていきます。

サンプルプログラム1

無名関数を使用したサンプルプログラムです。
関数名を書かないで関数を呼び出していることが分かります。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    echo "【PHP】関数<br>\n";
    echo "【引数】無名関数・useキーワードなし<br>\n";

    // 無名関数
    $call_func = function(string $str) :void {
        echo '$str:' . $str . "<br>\n";
    };      // 変数に関数を設定するため、最後のセミコロンは忘れないこと

    // 無名関数の呼び出し
    $msg ="Hello World";
    $call_func($msg);

    // 無名関数の呼び出し
    $msg ="ハローワールド";
    $call_func($msg);
?>

実行結果は次の通りです。

・画面

・HTML

【PHP】関数<br>
【引数】無名関数・useキーワードなし<br>
$str:Hello World<br>
$str:ハローワールド<br>

サンプルプログラム2

無名関数を使用し、useキーワードで関数外から変数を渡しているサンプルプログラムです。
値渡しの場合、useキーワードで渡した変数は無名関数の前に宣言した値が有効になっていることが分かります。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    echo "【PHP】関数<br>\n";
    echo "【引数】無名関数・useキーワード、値渡し<br>\n";

    // フラグの初期化
    $flg = false;

    // useキーワードで引数以外の変数が渡せる、値渡し
    $call_func = function(string $str) use($flg) :void {
        if($flg == false) {
            echo '[NG] $str:' . $str . "<br>\n";
            $flg = true;
            return ;
        }
        echo '[OK] $str:' . $str . "<br>\n";
    };      // 変数に関数を設定するため、最後のセミコロンは忘れないこと

    // 無名関数の呼び出し
    $msg ="Hello World";
    $call_func($msg);

    // 無名関数の呼び出し
    // フラグを初期化しても関数宣言前のfalseが有効になる
    $msg ="ハローワールド";
    $flg = true;
    $call_func($msg);
?>

実行結果は次の通りです。

・画面

・HTML

【PHP】関数<br>
【引数】無名関数・useキーワード、値渡し<br>
[NG] $str:Hello World<br>
[NG] $str:ハローワールド<br>

サンプルプログラム3

useキーワードで参照渡しで変数を渡しているサンプルプログラムです。
参照渡しの場合、useキーワードで渡した変数は変更可能なことが分かります。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    echo "【PHP】関数<br>\n";
    echo "【引数】無名関数・useキーワード、参照渡し<br>\n";

    // フラグの初期化
    $flg = false;

    // useキーワードで引数以外の変数が渡せる、参照渡し
    $call_func = function(string $str) use(&$flg) :void {
        if($flg == false) {
            echo '[NG] $str:' . $str . "<br>\n";
            $flg = true;
            return ;
        }
        echo '[OK] $str:' . $str . "<br>\n";
    };      // 変数に関数を設定するため、最後のセミコロンは忘れないこと

    // 無名関数の呼び出し
    $msg ="Hello World";
    $call_func($msg);

    // 無名関数の呼び出し
    // フラグを初期化しても関数宣言前のfalseが有効になる
    $msg ="ハローワールド";
    $flg = true;
    $call_func($msg);
?>

実行結果は次の通りです。

・画面

・HTML

【PHP】関数<br>
【引数】無名関数・useキーワード、参照渡し<br>
[NG] $str:Hello World<br>
[OK] $str:ハローワールド<br>

コメント