PHP 7.4 からアロー関数 (Arrow Function) が使えるようになっていたので触って見たメモ
Arrow Function
書式
fn(argument) => expr
JavaScript のアロー関数との違い
fn
キーワードが必要- 処理部分は
{ }
で囲ったブロックが使えない - 文末の
;
は必須
<?php declare(strict_types=1); $fn = fn(int $x, int $y):int => $x + $y; echo $fn(1, 2); // => 3
処理部分にブロックが使えない
<?php declare(strict_types=1); $fn = fn(int $x, int $y):int => { return $x + $y };
=> Parse error: syntax error, unexpected token "{"
シンタックスエラーになる
高階関数も使える
アロー関数の場合スコープを意識しなくとも良い
<?php declare(strict_types=1); $z = 1; $fn = fn(int $x) => fn(int $y) => $x + $y + $z; echo $fn(2)(3); // => 6
function
だとそのままでスコープ外の変数にアクセスできない
<?php declare(strict_types=1); $z = 1; function add(int $x) { return function (int $y) { return $x + $y + $z; }; } echo add(2)(3); // => 3 // Warning: Undefined variable $x // Warning: Undefined variable $z
👇 global
や use
キーワードを使う必要がある
<?php declare(strict_types=1); $z = 1; function add(int $x) { global $z; return function (int $y) use($x, $z) { return $x + $y + $z; }; } echo add(2)(3); // => 6
📝 第一引数に処理を加えたい場合
<?php declare(strict_types=1); $z =1; fn(int $x) => { $x = $x ** 2; return fn(int $y) => $x + $y + $z; }
こんな風に書けると便利だけど、PHP のアロー関数はブロックを取れないので第一引数に処理を加えるような場合は function
にネストさせる形でアロー関数を使うしかない
👇
<?php declare(strict_types=1); $z =1; function add(int $x) { // function なのでスコープ外のアクセスを明記 global $z; $x = $x ** 2; // アロー関数は上位スコープにある変数 $x, $z にはアクセス可能 return fn(int $y) => $x + $y + $z; } echo add(2)(3); // => 8
所感
普段触っている JavaScript にあるアロー関数が PHP でも使えるんだ〜と知って試してみたら fn
キーワードが必要とかブロック取れないとかスコープとか仕様の微妙な差があって方言みたいなものだけど触ってないとすぐ忘れてまたハマりそうだなって思いました!
たぶんまたハマってこのメモ自分で見返すな…
おわり₍ ᐢ. ̫ .ᐢ ₎
[参考]