関数仕様編 その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/

この記事が役に立ったらシェア!
メルマガの登録はこちら Web担当者に役立つ情報をサクッとゲット!

人気記事トップ10(過去7日間)

今日の用語

インデックス
検索エンジンがWebページをデータベースに保存しているデータベース。データベース ...→用語集へ

インフォメーション

RSSフィード


Web担を応援して支えてくださっている企業さま [各サービス/製品の紹介はこちらから]