関数仕様編 その14 (匿名関数と無名関数 その4)』
- 編集部の見解や意向と異なる内容の場合があります
- 編集部は内容について正確性を保証できません
- 画像が表示されない場合、編集部では対応できません
- 内容の追加・修正も編集部では対応できません
ヒューマンリソシア株式会社はコラム「関数仕様編 その14 (匿名関数と無名関数 その4)」を公開しました。
今回は、無名関数の「匿名関数にはない」部分について見ていきたいと思います。
言い方を変えると「コールバックとしての無名関数、ではなくて、
レキシカルスコープをもつクロージャとしての無名関数」を見ていきます、って書き方になりましょうか。
さて、というわけで「レキシカルスコープ」です。
レキシカル(lexical)ですが、これには「語彙」とか「語句」、「字句」とかいう意味合いがあります。
コンパイラの世界では「字句解析器」という初手の処理があって、これが「lexical analyzer」とか呼ばれますが、
ここに、レキシカル、という単語が入ってきます。
端的には「実行時ではなく、プログラムを文法的に解釈していくタイミングで見て取れる」スコープ、というような感じですね。
少し、実際の使い方こみで、見ていきましょう。
まずは「エラーになる(というか$aが解決できない)」例です。
function hoge() {
//
$a = 100;
//
$func = function() {
var_dump($a);
};
//
$func();
}
//
hoge();
これだとNULLが返ってきます。$aは「親のスコープ内」ではあっても、
無名関数のスコープ内ではないためです(この辺、JavaScriptなどのスコープチェーンとは異なる動きですね)。
無名関数内で「親のスコープの変数を使う」場合、以下のように、明示的に「使うよ~」って宣言します。宣言には、use句を用います。
function hoge() {
//
$a = 100;
//
$func = function() use($a) {
var_dump($a);
};
//
$func();
}
//
hoge();
この続きは以下をご覧ください
http://resocia.jp/column/1674/
ソーシャルもやってます!