[PHP] 無名関数とアロー関数について

無名関数はその名の通り、名前を持たない関数で、クロージャーとも呼ばれます。

無名関数

構文

function(引数) {
    処理;
}

[実装例]無名関数を変数に入れて使う

コード

$func = function(string $value) {
    print "Hello {$value}\n";
};

$func("Test");

このコードの正しく実行でき、結果は以下のようになります。

実行結果

$ php test_anonymous_function.php
Hello Test

[実装例]呼び出し元スコープの変数を使う

コード(誤)

無名関数の呼び出し元のスコープに定義されている変数は、無名関数内でそのまま扱うことはできません。例えば以下のコードは実行時にエラーになります。

$name = "Hoge";

$func = function(string $value) {
    print "Hello {$value} {$name}\n";
};

$func("Test");

実行結果(誤)

$ php test_anonymous_function.php

Warning: Undefined variable $name in ./test_anonymous_function.php on line 5
Hello Test

コード(正)

呼び出し元スコープの変数を無名関数内で利用するには、function定義時にuseキーワードを使用して無名関数に渡してやります。

$name = "Hoge";

$func = function(string $value) use ($name) {
    print "Hello {$value} {$name}\n";
};

$func("Test");
  • 無名関数内で呼び出し元スコープの変数を使うには、useキーワードに使用する変数を指定する

実行結果(正)

$ php test_anonymous_function.php
Hello Test Hoge

[実装例]呼び出し元スコープの変数を更新する

コード

useキーワードの変数を参照渡しにすれば、呼び出し元スコープの変数を更新することが可能です。

$name = "Taro";

$func = function(string $value) use(&$name) {
    $name = "Jiro";
    print "Hello Callable {$value} {$name}\n";
};

$func("Test");

実行結果

$ php test_anonymous_function.php
Hello Callable Test Jiro
Hello Jiro

アロー関数

アロー関数とは無名関数をシンプルに表現する仕組みです。

無名関数とは以下のような違いがあります。

  • functionからfnに変更
  • 処理を記載する括弧{}は無し、代わりに=>を使う
  • 単一の処理のみ記述できる
  • useキーワードは使えない、ただし呼び出し元スコープの変数の参照はできる(useキーワードで値渡しされているのと同じことなので変更はできない)

構文

fn(引数) => 単一の処理;

実装例

コード

$name = "Hoge";

$func = fn(string $value) => print "Hello {$value} {$name}";

$func("Test");

実行結果

$ php test_anonymous_function.php
Hello Test Hoge
  • 単一の処理のみアロー関数で記述可能
  • 呼び出し元変数は値渡しになるため、変数の更新はできない

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)