かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP もアロー関数書けたのですね!

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
👇 globaluse キーワードを使う必要がある
<?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 キーワードが必要とかブロック取れないとかスコープとか仕様の微妙な差があって方言みたいなものだけど触ってないとすぐ忘れてまたハマりそうだなって思いました!
たぶんまたハマってこのメモ自分で見返すな…

おわり₍ ᐢ. ̫ .ᐢ ₎


[参考]

Sweet Daytime

Sweet Daytime

  • SUNRISE Music Label
Amazon