こんにちは!
ナビゲータのEVEです。
つい最近ですが、今までの疑問が1つ解決されました。それは、無名関数・・・。
実は、以前Google Mapを自サイトに取り込んでいる最中に、Googleから提供されているAPIを解析したのですが、その中に、無名関数がありました。ただ、古いエンジニアってプログラムでこんなことができるなんて知りません。なんで、関数を変数に挿入したり、引数として設定しているのかが分かりません。
1つ分からないことがあると、私の場合は混乱し、それ以降解析ができなくなります。現在なら、AIがあるので、解析は容易なのですが、その当時はありませんから・・・。
そんな、今まで疑問だった、無名関数を今回のPHPの再学習で知ることができました。
[無名関数]
無名関数は、名前は不要で、特定の機能だけを定義したいという場合に、利用することで、スクリプトがより読みやすくなります。
以下がその例です。
function myArrayWalk(array $array, callable $func): void
{
// 配列$arrayの内容を順に処理
foreach ($array as $key => $value) {
$func($value, $key);
}
}
$data = ['杉山', '長田', '杉沼', '和田', '土井'];
myArrayWalk($data, function($value, $key) {
print "{$key}:{$value}
";
});
以上のプログラムでは、myArrayWalk関数に、引数として、配列$dataと無名関数を設定し呼び出しています。
以上のプログラムの実行結果は以下の通りです。
0:杉山<br/>
1:長田<br/>
2:杉沼<br/>
3:和田<br/>
4:土井<br/>
無名関数を利用するシーンなのですが、プログラムの可読性を上げる以外に、関数って普通、頻繁に利用する機能を定義します。ただ、他のプログラム、クラスでの再利用性がなく、かつメソッド内といった狭義の範囲で再利用される場合などに定義されると認識していますが合っていますでしょうか?その認識が正しいかどうかChatGPTに聞いてみましょう!
無名関数(クロージャ)を利用する利点には以下の点が挙げられます。
❶簡潔なコード
無名関数は、関数を定義して使用するために、関数名をつける必要がないため、コードが簡潔になります。特に、一時的な処理や短い処理を行いたい場合に非常に便利です。
例えば、array_walk や array_map といった関数に無名関数を渡す場合、わざわざ別の関数を定義せずに、必要な処理をその場で書くことができます。
❷コードの可読性の向上
無名関数は、処理が行われるコンテキスト内で即座に定義され、どの部分で使われているのかが明確です。これにより、関数の定義が必要ない場合に冗長なコードを避け、より直感的に理解できるようになります。
❸クロージャによる変数のスコープ管理
無名関数(クロージャ)は、定義されたスコープの変数を「キャプチャ」することができます。つまり、外部の変数を無名関数内で使用できるという特徴があります。この機能により、関数外で設定された変数を簡単に利用することができ、特定の処理を外部環境に依存させた関数を定義できます。
❹一時的な処理を分離
無名関数を使うことで、他の関数に依存する一時的な処理を分離できます。これにより、コードがモジュール化され、再利用性や保守性が向上します。
例えば、特定の配列操作を行いたい場合に、無名関数をその場で渡すことができ、他の部分には影響を与えません。
ちょっと、違いましたか?ただ、これ以降、無名関数が出てきても驚くことはなくなりそうです。
[あとがき]
無名関数は、PHP5.3とかなり以前から利用することができ、Prototype EVEでも利用可能だったということが分かりました。
かなり以前から利用可能だった分けですが、プログラムとして見たのは、Googleから提供されているプログラムが初めてで、正直いって、他のプログラムで見たことはありません。そして、これから作る自分のプログラムで使うシーンも思い浮かびません。わざわざ作ろうと思いませんしね・・・。まっ、これから、徐々に慣れていきたいと思います。
それと、今回勉強した中に、可変関数というのがあるのですが、それと似たような機能がJavaScriptにもあって、そっちも、これから勉強しようと考えています。
高水準言語としてのそれぞれのプログラム言語に、いろいろな機能を追加しても結局機械語に翻訳されて同じようなコードに変換されるのだから、あまり、難しいことをしてほしくないと思っているのは私だけでしょうか?可読性があがるとChatGPTはいうけれど、あんまり、そんな気はしないのですが・・・。慣れですかね?とりあえず、当初のプログラムは、できるだけ、新たな機能を利用しようと考えていますが、無理せず製造したいと思います。
では、また!!!