関数仕様編 その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/
本プレスリリースは発表元企業よりご投稿いただいた情報を掲載しております。
お問い合わせにつきましては発表元企業までお願いいたします。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]