とぎぷろべい

包丁研ぎとプログラミングと米国株投資についてのなんやかんや

無名関数(クロージャ―)について(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1における無名関数(クロージャ―)について

<?php
declare(strict_types=1);  //データ型検査の厳重化

//①ただ足し算をするだけのユーザー定義関数
function aaa(int $a1, int $a2): int {
  return $a1 + $a2;
}

$aa = aaa(1012);
echo $aa. "\n";      //22


//②①を無名関数(クロージャ―)で作ってみる
$bbb = function (int $b1, int $b2): int {  //無名関数では$〇〇=function()の表記になる
  return $b1 + $b2;
};                   //無名関数はここにセミコロンがいる

$bb = $bbb(1012);  //無名関数の実行には$がいる
echo $bb. "\n";      //22


//③②の無名関数を別のユーザー定義関数のパラメータとして使ってみる
function ccc($bbb) {               //$bbbの名前が変わると面倒なので$bbbに指定
  $c1 = $bbb(12432526231);       //$bbbの無名関数の処理結果が$c1に代入
  $c2 = $bbb(564-96);            //$bbbの無名関数の処理結果が$c2に代入

  return number_format($c1 * $c2); //演算結果をnumber_format関数で整形
}

$cc = ccc($bbb);  //ccc関数のパラメータに無名関数オブジェクトの入った$bbbを指定
echo $cc. "\n";   //252,094,284


//④無名関数はパラメータとして直接書くこともできる
function ddd($dd) {
  $d1 = $dd(12432526231);        //$ddの無名関数の処理結果が$d1に代入
  $d2 = $dd(564-96);             //$ddの無名関数の処理結果が$d2に代入

  return number_format($d1 * $d2); //演算結果をnumber_format関数で整形
}

$dd = ddd(function ($a1, $a2) {    //ddd関数実行のパラメータに直接無名関数を書く
  return $a1 + $a2;
});
echo $dd. "\n";                    //252,094,284


//⑤無名関数をもっと簡単に書くパターン
$eee = fn($a, $b) => $a + $b;      //無名関数を省略して書くとこうなる

function eee($ee) {
  $e1 = $ee(12432526231);
  $e2 = $ee(564-96);

  return number_format($e1 * $e2);
}

$ee = eee($eee);
echo $ee. "\n";  //252,094,284

無名関数とは、ユーザー定義関数のようにfunctionのあとに関数名を指定しない方法で作った関数のことです。

 

無名関数はクロージャ―とも呼ばれます。

無名関数はその名のとおり名前がないので、通常の関数のような記述ではその関数を実行することはできません。

 

無名関数と通常のユーザー定義関数の大きな違いは、無名関数が「変数に代入できる」ことと「関数のパラメータに指定できる」ことです。

通常の名前ありのユーザー定義関数では、変数に代入することも関数のパラメータに直接指定することもできません。

 

無名関数が実際にどのような処理になっているのかは、上記のスクリプトを確認してください。

①は通常のユーザー定義関数で、②は①を無名関数にしたものです。

そして③以降では、ユーザー定義関数のパラメータとして無名関数を指定しています。

 

 

無名関数の定形は以下のとおりです。

 

・定形①

function (パラメータ1, パラメータ2) {
おこないたい処理;
};

 

・定形②

fn(パラメータ1, パラメータ2) => おこないたい処理;

 

 

通常のユーザー定義関数ではいらないのですが、無名関数の記述ではブラケット(角括弧)の閉じ記号の後ろにセミコロンが付きます。

これを忘れると当然のようにErrorが出ますのでご注意ください。

 

 

以上です。