現在、クロージャーについて勉強しております。
PHPを勉強している素人で他の言語の経験はありません。
JSの簡単なコードなら理解できる程度です。
クロージャーについて理解するにあたり、下記の記事を読みました。
- Java - 恥ずかしながらクロージャが分かりません。(41031)|teratail
- PHP - PHPにおける無名関数、匿名関数、クロージャーの意味(52961)|teratail
- ちょっと高度にJavaScript/クロージャの基礎
- 私が今までクロージャを理解できなかった理由
- PHPでクロージャーを使う
- クロージャ再考
- クロージャとラムダ式をザックリ解説してみる
- 匿名関数と無名関数 (PHP Advent Calendar 2010 16日目)
- パーフェクトPHPのクロージャの説明が全然わからなかった
一通り読んだだけで、完全に理解できたわけではないですが、Wikipediaのクロージャーの説明についても何となく理解できるようになりました。
引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。
下記のコードを参考に私なりの解釈を述べます。
php
101 <?php 202 function create_counter() 303 { 404 $count = 0; 505 return function() use (&$count) { 606 return ++$count; 707 }; 808 } 909 1010 $counter = create_counter(); 1111 echo $counter() . PHP_EOL; # => 1 1212 echo $counter() . PHP_EOL; # => 2 1313 echo $counter() . PHP_EOL; # => 3
引数以外の変数
とは上記のコードでは、$count
が該当するかと存じます。
これを、レキシカル変数と呼ぶかと存じます。
このレキシカル変数は、function() use (&$count) {
から};
が定義された環境で評価されるのかと存じます。
ただ、実行時と定義時を正しく理解できておりません。
そもそもPHPで書いたコードがどのように処理されているのか理解できていません。
例えば、上記のコードでいうと 11 echo $counter() . PHP_EOL;
で$counter()
関数がコールされると02 function create_counter()
と08 }
の中の式を評価し、その結果を表示しているのか、それとも、関数は事前に評価されてるのかなど、変数や関数などがどのような順番で処理されているのか基本的なことを理解できておりません。
理解したいと思い、調べてみたら PHPの実行時とコンパイル時 には関数はコンパイル時という説明がありました。
#質問
実行時、定義時、コンパイル時のそれぞれの違いを教えてください。
実行時、定義時、コンパイル時の違いについて回答いただけると大変有り難いですが、おそらく一言、二言で説明できるものではないと存じます。
そのときは参考サイトや書籍などを教えていただけると助かります。
調べてはいるのですが、どのようなキーワード検索すると詳細が載っているサイトがヒットするのかわかりません。
参考サイトを教えていただくだけでも大変有り難いです。
ご存の方いれば教えてくださいm(__)m
追記
調べる前は、PHPはインタプリタで上から順にコードを実行していると勝手に解釈していましたが、下記のように一手間あるというのはわかりました。
現代的なインタプリタはソースコードをパースしたあと仮想機械のバイトコードにコンパイルする。
PHPはソースコードをコンパイルしてから実行するため純粋なインタプリタとは言えないが、動きはインタプリタに似ている。
また、PHPはサーバーサイドスクリプト言語でZend Engineで処理しているという初歩の初歩なら理解しております。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/10/31 15:11