[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
- 単一の処理のみアロー関数で記述可能
- 呼び出し元変数は値渡しになるため、変数の更新はできない
コメント
コメントを投稿