2024.12.23
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
アロー関数って?
こんにちは!福神漬けです。
php7.4からアロー関数という書き方がphpでもできるようになりました。
JavaScriptだとかなりメジャーで便利な書き方ですね。
ただphpのアロー関数はJSのものと書き方や仕様が少し違います。
//関数の中身を1行しか書けない
//「fn」は書く必要がある
//親のスコープの変数を使えるが、変更はできない
$y = 1;
$arrowFn = fn($x) => $x + $y;
echo $arrowFn(3);//4
詳しい仕様を知りたい方は公式マニュアルで
https://www.php.net/manual/ja/functions.arrow.php
アロー関数で部分適用
さてこのアロー関数、制約の厳しさからあんまり活用機会が無いなーとか思っていましたが、
部分適用させたい時にとてもスッキリ書けるようになったことに気がつきました。
具体的にはこんな感じです。
$headRemoveFunc = fn($str) => mb_substr($str,1);
echo $headRemoveFunc("core-tech");//ore-tech
ちなみにこんな書き方もできます。
$baseRemoveFunc = fn($num) => fn($str) => mb_substr($str, $num);
$Remove3Func = $baseRemoveFunc(3);
echo $Remove3Func("core-tech");//e-tech
引数を複数取る関数は標準関数にも多くありますし、フレームワークの関数でもよく用意されます。
例えばlogを表示するときに、文字と一緒にログレベルを渡したり、とかですね。
便利ですが複雑にやりすぎると理解しづらいですし、
phpは部分適用された関数の型を単なるClosureとしか判別できないので、
あくまでも短いスコープと、少ない引数の関数で使うのがよいかと思います。
余談
php8.0から名前付き引数がサポートされ、これを組み合わせて好きな引数の順番で部分適用できたらいいなーって考えました。
こちらの記事も参考にさせていただきました。
PHPで名前付き引数の部分適用を実現する
https://qiita.com/mpyw/items/2be02095691403c34e97
自分が試行錯誤した結果は、引数が3つとかになるとどうやっても綺麗にならないなーという感じです。
保守性や可読性とかを考慮すると名前付き引数の重要性は高いと思っているので、
何か綺麗に書ける形があれば嬉しいのですが…
終わりに
そもそもクロージャーを返す関数、というのが馴染みがない人も多いかもしれません。
関数型プログラミングという考え方も広まってきて、それへの足掛かりにもなると思いますので、
気になった方はぜひ試しに書いてみてください。
お疲れ様でした!