回答編集履歴

8

修正

2016/11/22 04:08

投稿

7968
7968

スコア253

test CHANGED
@@ -1,6 +1,4 @@
1
- **【調査メモ】**
2
-
3
- **teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答追記します。 **
1
+ **調査メモの続き:teratailの質問は、上限が10000文字で質問には追記できないので回答追記します。**
4
2
 
5
3
 
6
4
 

7

修正

2016/11/22 04:08

投稿

7968
7968

スコア253

test CHANGED
@@ -8,10 +8,6 @@
8
8
 
9
9
 
10
10
 
11
- #### 「ローカル変数」「一時的な変数」「一時的ではない変数」の違いは?
12
-
13
-
14
-
15
11
  様々な変数をダンプしてみました。
16
12
 
17
13
 

6

読みにくいので少し修正

2016/11/22 04:04

投稿

7968
7968

スコア253

test CHANGED
@@ -1,10 +1,10 @@
1
- #追記】調査メモ
1
+ **【調査メモ】**
2
-
3
-
4
-
2
+
5
- ** ※teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答へ追記します。 **
3
+ **※teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答へ追記します。 **
4
+
5
+
6
+
6
-
7
+ #【追記1】
7
-
8
8
 
9
9
 
10
10
 
@@ -176,7 +176,7 @@
176
176
 
177
177
 
178
178
 
179
- ## さらに追記
179
+ #追記2】
180
180
 
181
181
 
182
182
 
@@ -236,7 +236,7 @@
236
236
 
237
237
 
238
238
 
239
- ### 少し追記
239
+ #追記3】
240
240
 
241
241
 
242
242
 

5

少し追記

2016/11/22 04:03

投稿

7968
7968

スコア253

test CHANGED
@@ -233,3 +233,15 @@
233
233
  |`~`|Temporary variable|ZendEngine内で利用される変数|
234
234
 
235
235
  |`$`|Variable|通常の変数|
236
+
237
+
238
+
239
+ ### 少し追記
240
+
241
+
242
+
243
+ [別の質問](https://teratail.com/questions/55152)で変数値や即値に対応するzvalやHashTableはオペコード作成時またはオペコード実行時に作成されると教えて頂きました。
244
+
245
+
246
+
247
+ 何の根拠もありませんが、オペコード作成時に確定できる変数が `ハッシュ化された変数` ではないかと考えております。例えば、`$a = 1`というのはオペコード作成時に確定できるため、`!0`となっているのかと思います。オペコード実行時にしか確定できないのは、計算結果などです。`$a + $b`のような計算結果は`~2`となっています。オペコード実行時に計算され、そのときに確定するので、このような変数が `ZendEngine内で利用される変数` ではないかと思います。他に `普通の変数` というのがありますが、いまいちわかっておりません。以上、憶測というか妄想です。

4

変更

2016/11/18 07:34

投稿

7968
7968

スコア253

test CHANGED
@@ -176,11 +176,7 @@
176
176
 
177
177
 
178
178
 
179
- ---
180
-
181
-
182
-
183
- ### さらに追記
179
+ ## さらに追記
184
180
 
185
181
 
186
182
 

3

追記

2016/11/10 08:34

投稿

7968
7968

スコア253

test CHANGED
@@ -180,7 +180,7 @@
180
180
 
181
181
 
182
182
 
183
- ### 追記
183
+ ### さらに追記
184
184
 
185
185
 
186
186
 
@@ -224,7 +224,7 @@
224
224
 
225
225
 
226
226
 
227
- まとめると下記のような感じかなと思います。(自信なし)
227
+ まとめると下記のような感じかなと思います。(自信なし^^;
228
228
 
229
229
 
230
230
 

2

追記

2016/11/10 08:27

投稿

7968
7968

スコア253

test CHANGED
@@ -173,3 +173,67 @@
173
173
  次に `new Gamma` を処理しているようですが、先ほどの `:7` の返り値を指定することで、`$8`というローカル変数的な何かが返ってくるようです。
174
174
 
175
175
  何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
176
+
177
+
178
+
179
+ ---
180
+
181
+
182
+
183
+ ### 追記
184
+
185
+
186
+
187
+ `! $ ~` について参考になるものを見つけたので、追記します。
188
+
189
+
190
+
191
+ OpenOfficeのファイルですが、[phpopcodes_aug2008](https://wiki.php.net/_media/phpopcodes_aug2008.odp) にVLDに関しての記述があります。下記が引用です。
192
+
193
+
194
+
195
+ > ! == compiler variable
196
+
197
+ $ == variable
198
+
199
+ ~ == temporary
200
+
201
+
202
+
203
+ この3つについて [第三回闇PHP勉強会開催した&PHPカンファレンスとPHPMatsuriで喋った](http://blog.anatoo.jp/entry/20121124/1353692635) に説明がありました。下記が引用です。
204
+
205
+
206
+
207
+ > ZendEngine内部で使われる変数の種類には以下の3つがあります。
208
+
209
+ >
210
+
211
+ > Variable 通常のPHPの変数
212
+
213
+ > Temporary variable ZendEngineないで利用される変数
214
+
215
+ > Compiled variable ?
216
+
217
+ >
218
+
219
+ > このうち、最初のVariableはPHPの$hogeみたいな通常の変数のことで、その次のTemporary VariableはZendEngine内部でのみ利用されるレジスタのような変数ということがわかっていたのですが、三番目のCompiled Variableというのが何のことがよくわかっていませんでした。
220
+
221
+ > これなんなのかというと、通常のPHPの変数と同じものなんですが、$hogeみたいなPHPの変数はZendEngineのハッシュテーブルの中で管理されているのですが、ハッシュテーブルなので当然格納するときは変数名がハッシュ化されます。Compiled Variableとは、実行時に変数名をハッシュ化してオーバーヘッドにならないようにコンパイル時に予めハッシュ化されるPHPの変数ということがコードを読んでわかりました。
222
+
223
+ > 確かにPHPの変数名は実行時にならないとわからない場合もありますが、$hogeみたいなコードの場合はコンパイル時に変数名もわかっているわけなので予め変数名をハッシュ化しておいたほうがオーバーヘッドが少ないということなんでしょう。
224
+
225
+
226
+
227
+ まとめると下記のような感じかなと思います。(自信なし)
228
+
229
+
230
+
231
+ |記号|用語|意味|
232
+
233
+ |:--|:--|:--|
234
+
235
+ |`!`|Compiled variable|ハッシュ化された変数|
236
+
237
+ |`~`|Temporary variable|ZendEngine内で利用される変数|
238
+
239
+ |`$`|Variable|通常の変数|

1

訂正

2016/11/10 08:26

投稿

7968
7968

スコア253

test CHANGED
@@ -156,11 +156,11 @@
156
156
 
157
157
  |:--|:--|
158
158
 
159
- |`!`|グローバル変数|
159
+ |`!`|グローバル変数|
160
160
 
161
- |`~`|計算結果(一時的な変数と呼んでいいのかな?)|
161
+ |`~`|計算結果(一時的な変数と呼んでいいのかな?)|
162
162
 
163
- |`$`|ローカル変数|
163
+ |`$`|ローカル変数|
164
164
 
165
165
 
166
166