ナビゲータのEVEです。
本日は、プログラム研究室から、 PHP 7.4から登場した新たな機能についてお話ししましょう。
本日は、アロー関数です。
[アロー関数]
アロー関数 は、 無名関数 をより簡潔に書くことができるように導入されたプログラミング手法だと言われています。早速プログラムを見てみましょう!以下は独習PHP第4版に掲載されている例です。
価格: 3740円
(2024/11/20 15:31時点)
感想(0件)
? $keys = ['十','百','千','万','億','兆','京','稿','溝','潤','正','戯','極','恒河沙','那由他','不可思議','無量大数'];
? $data = ['那由他','京','億','無量大数'];
? ?B usort($data, ?@ fn($a, $b) => ?A array_search($a, $keys) ?C <=> array_search($b, $keys));
//結果
?$keysは、日本の数値の単位を昇順に並べています。一部省略しています。
?$dataは、今回ソートする対象となっています。
?usortは、カスタムな順序で、配列を並べ替える関数で、第2引数に式を記述することができる関数です。ここでは、第1引数にソート対象の引数を指定し、第2引数にアロー関数を定義しています。
具体的にアロー関数の中身を見ていくと、?@fn($a,$b)という部分は、$a、$bという変数を定義しているぐらいの認識で問題ないようです。ここでは、型指定を省略していますが、型指定もできます。
そして、?Aarray_search($a, $keys) <=> array_search($b, $keys));という部分は、$keysデータの配列の各要素がどのインデックスに格納されているのか知らべるために実行しています。ただ、この方法は非効率で、なんで、こんなことをするのか疑問です。
そして、最後に、$keysから取得したインデックスに基づいて、usort内で$dataの要素を並び替えます。
簡単ですね・・・って、なかなか言い難いロジックです。例も悪いですけれど・・・。
そして、最後に余談ですが、?Cは宇宙船演算子と言います。
宇宙船演算子 は、の一種で、PHP7から利用できるようになりました。
これは、比較演算子の一種で、array_search($a, $keys) とarray_search($b, $keys))を比較して、次の3つの結果のいずれかを返します。
左辺が小さい場合: -1
左辺が等しい場合: 0
左辺が大きい場合: 1
理解できましたか?このアロー関数は本を読む限り積極的に利用したほうがいい方法だそうです。っと言われても、なかなかそう思えないので、アロー関数の概要と、メリット、デメリットをChatGPTに解説をしてもらいましょう。
アロー関数は、PHP 7.4 で導入された新しい無名関数(クロージャ)の構文です。従来の無名関数(function を使った関数)に比べて、より簡潔で読みやすく書くことができます。特に、変数のキャプチャに関して特長があります。
・fn キーワードを使って関数を定義します。
・引数は丸括弧で囲み、=> で関数本体の式を指定します。
■アロー関数の特徴
?簡潔さ
アロー関数は、従来の無名関数に比べて非常に簡潔に記述できます。特に引数が1つだけの場合や、簡単な処理を行う場合に有用です。
?変数のキャプチャ
アロー関数の最大の特徴は、外部の変数を自動的にキャプチャする点です。従来の無名関数では、外部の変数を使う場合に、useを使って明示的にキャプチャする必要がありましたが、アロー関数ではこの手間が省けます。
?戻り値の簡略化
アロー関数は、戻り値を自動的に返します。関数本体が1行の式であるため、return キーワードを使う必要がありません。
■アロー関数のメリット
?コードの簡潔化
アロー関数は、無名関数を短いコードで表現できるため、コードが読みやすく、記述量も減ります。特にコールバック関数や配列操作で便利です。
?外部変数のキャプチャが簡単
use を使わずに外部の変数を直接キャプチャすることができ、コードが簡潔で直感的になります。複雑なクロージャを使用する際の可読性向上につながります。
?戻り値の省略
アロー関数では、式の結果が自動的に返されるため、return を省略できる点がメリットです。
?無名関数との互換性
アロー関数は無名関数のシンプルな形式として利用でき、特に簡単なコールバック処理や1行で終わる処理で効果的です。
■アロー関数のデメリット
?1行式に制限される
アロー関数の本体は1行の式でなければならず、複数行の処理を行いたい場合には使えません。この制約により、複雑なロジックには向いていません。
?キャプチャされる変数の制限
アロー関数では、自動的に外部変数をキャプチャしますが、従来の無名関数のように変数を明示的に指定してキャプチャすることはできません。このため、意図しない変数がキャプチャされてしまうこともあります。
?可読性の低下
簡潔に書ける反面、複雑な処理を行う際に使いづらくなる場合もあります。特にチーム開発や、複雑なロジックが必要な場合には、アロー関数が逆に可読性を損なうことがあります。
?戻り値の自動返却に注意
アロー関数は式の結果を自動的に返すため、期待しない戻り値を返してしまう場合があります。例えば、返すべき値を計算せずに式だけを書いてしまうと予期せぬ挙動をすることがあります。
■結論
アロー関数は、シンプルで効率的なコードを書くための強力なツールですが、その使用にはいくつかの制限もあります。簡単な処理や1行で終わる処理には最適ですが、複雑なロジックには従来の無名関数や普通の関数の方が適している場合もあります。使用するシーンに応じて、アロー関数と従来の無名関数を使い分けることが重要です。
[あとがき]
やっと、PHP5以降に使用できるようになった、難解だと思われる機能のほとんどを押さえることができたようです。独習PHP第4版のまだ読んでいない部分は、じっくり読みますが、さらっと読んでも問題ない内容のようです。
これ以降は、組み込み関数と標準クラスライブラリを毎日少しずつまとめながら、特筆すべき事項がでてきたら、別途同箇所をまとめていくといった作業になりそうです。
よく知っていると思っていた言語ですが、新しい機能がたくさん出てきたことにより、なんか、新たに言語を取得した気分です。
現在製造しているシステムは、最新のプログラム事情を知らなくても、プログラミングはできるわけなのですが、新たに製造するクラスなどもあり、より最新なプログラミングに近づけるため、独習PHP第4版の読破を優先していました。ただ、この時間以降は、クラス製造をメインにやっていきたいと思います。
では、また!