関数仕様編 その14 (匿名関数と無名関数 その4)』

ヒューマンリソシア

2015年12月1日 19:37

※この記事は読者によって投稿されたユーザー投稿のため、編集部の見解や意向と異なる場合があります。 また、編集部はこの内容について正確性を保証できません。
ヒューマンリソシア株式会社はコラム「関数仕様編 その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/
この記事のキーワード

人気記事トップ10

人気記事ランキングをもっと見る