PHPオンライン学習

ステップ38 - 無名関数(クロージャ)

やってみよう無名関数はクロージャとも呼ばれ、関数名を定義せずに関数定義を行う事を指します。PHPの内部関数には引数に関数定義を渡せるものがあります。また値の代わりに関数定義を変数に代入することも可能です。変数を無名関数に渡す場合は、useキーワードを使用します。構文:変数名 = function (引数) use (変数) { 実行する処理 };

クロージャとは?

クロージャは無名関数(ラムダ式とも呼ばれる)を用い、無名関数内で親関数で定義されたローカル変数を使用する関数定義を指します。そうすることでグローバル変数を減らし、コールバック関数の使用も避けることができます。親関数の事をエンクロージャ(囲い込むものという意味)と呼びます。

コールバック関数とは?

コールバック関数は関数の引数として関数定義を受け取る関数定義を指します。コールバック関数を多用しすぎるといわゆる「コールバック地獄」に陥るリスクがあるため、多用することは忌避されています。PHPでコールバック関数を用いる例としてはpreg_replace_callback関数が挙げられます。同関数では正規表現を用いて検索を行い、コールバック関数を使用して置換を行います。

クロージャは必要?

元々クロージャはJavaScriptのようにクラス機構がない言語でカプセル化を行うために生み出されました。

実はクロージャと同じことはクラスで実現できます。実際、PHPではクロージャは内部的にはクラスに変換されます。しかしそれでもクロージャが用いられるのはクラスに比べて簡潔に記述できるからに他なりません。従って、PHPやC++、Javaなどクラスが使える言語であれば、クラスを用いてクラス変数や関数のカプセル化が普通に実現できるため、実際のところクロージャを使用する必然性はなく、どちらを使用するかは開発者の好みの問題と言えるでしょう。

サンプルコード
function parent() { //親関数(エンクロージャ)

    //parent関数スコープのローカル変数
    $str1 = "こんにちは、";
    $str2 = "さん";

    //無名関数(クロージャ)
    //use句を用いて外側にある変数($str1、$str2)を取り込む
    $example = function ($name) use ($str1, $str2): string { //戻り値の型(string)はuse句の後に記述
        return $str1 . $name . $str2;
    }; //セミコロンが必要であることに注意

    //使用方法は通常の関数と同じ
    echo $example("太郎");

}

parent();

        
エディタの表示行数:

PHPバージョン8.2

PHPバージョン:

使い方 PHPのコードをWeb上で実行して実行結果を確認しながら学べる無料のPHPチュートリアルです。
コード欄にサンプルのPHPのコード(<?php?>は不要)を記述して、実行ボタンをクリックしてください。
PHPのソースコードをphpコマンドで実行するのと同じような感覚で実行結果が下のテキストエリアに表示されます。
また、関数の自動補完(2文字目を入力した時点で関数候補を表示)やコードエディタの背景色の変更も可能です。
PHPを学びたいけど実行環境がすぐに作れない、外出中で実行環境がない場合などに無料で気軽にPHPが学べるサイトです。

注意 無限ループや処理に時間がかかるコードを実行した場合、約1秒でタイムアウトしその時点の結果を出力します。
なるべく高い負荷のかかるコードの実行はご遠慮ください。

注意 画面解像度 1366×768 以上での利用を推奨します。

このページのトップに戻る