回答編集履歴
8
修正
answer
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
**【調査メモ】**
|
2
|
-
**
|
1
|
+
**調査メモの続き:teratailの質問は、上限が10000文字で質問には追記できないので回答に追記します。**
|
3
2
|
|
4
3
|
#【追記1】
|
5
4
|
|
7
修正
answer
CHANGED
@@ -3,8 +3,6 @@
|
|
3
3
|
|
4
4
|
#【追記1】
|
5
5
|
|
6
|
-
#### 「ローカル変数」「一時的な変数」「一時的ではない変数」の違いは?
|
7
|
-
|
8
6
|
様々な変数をダンプしてみました。
|
9
7
|
|
10
8
|
```
|
6
読みにくいので少し修正
answer
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
**【調査メモ】**
|
2
|
+
**※teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答へ追記します。 **
|
2
3
|
|
3
|
-
|
4
|
+
#【追記1】
|
4
5
|
|
5
|
-
|
6
6
|
#### 「ローカル変数」「一時的な変数」「一時的ではない変数」の違いは?
|
7
7
|
|
8
8
|
様々な変数をダンプしてみました。
|
@@ -87,7 +87,7 @@
|
|
87
87
|
次に `new Gamma` を処理しているようですが、先ほどの `:7` の返り値を指定することで、`$8`というローカル変数的な何かが返ってくるようです。
|
88
88
|
何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
|
89
89
|
|
90
|
-
#
|
90
|
+
#【追記2】
|
91
91
|
|
92
92
|
`! $ ~` について参考になるものを見つけたので、追記します。
|
93
93
|
|
@@ -117,7 +117,7 @@
|
|
117
117
|
|`~`|Temporary variable|ZendEngine内で利用される変数|
|
118
118
|
|`$`|Variable|通常の変数|
|
119
119
|
|
120
|
-
#
|
120
|
+
#【追記3】
|
121
121
|
|
122
122
|
[別の質問](https://teratail.com/questions/55152)で変数値や即値に対応するzvalやHashTableはオペコード作成時またはオペコード実行時に作成されると教えて頂きました。
|
123
123
|
|
5
少し追記
answer
CHANGED
@@ -115,4 +115,10 @@
|
|
115
115
|
|:--|:--|:--|
|
116
116
|
|`!`|Compiled variable|ハッシュ化された変数|
|
117
117
|
|`~`|Temporary variable|ZendEngine内で利用される変数|
|
118
|
-
|`$`|Variable|通常の変数|
|
118
|
+
|`$`|Variable|通常の変数|
|
119
|
+
|
120
|
+
### 少し追記
|
121
|
+
|
122
|
+
[別の質問](https://teratail.com/questions/55152)で変数値や即値に対応するzvalやHashTableはオペコード作成時またはオペコード実行時に作成されると教えて頂きました。
|
123
|
+
|
124
|
+
何の根拠もありませんが、オペコード作成時に確定できる変数が `ハッシュ化された変数` ではないかと考えております。例えば、`$a = 1`というのはオペコード作成時に確定できるため、`!0`となっているのかと思います。オペコード実行時にしか確定できないのは、計算結果などです。`$a + $b`のような計算結果は`~2`となっています。オペコード実行時に計算され、そのときに確定するので、このような変数が `ZendEngine内で利用される変数` ではないかと思います。他に `普通の変数` というのがありますが、いまいちわかっておりません。以上、憶測というか妄想です。
|
4
変更
answer
CHANGED
@@ -87,10 +87,8 @@
|
|
87
87
|
次に `new Gamma` を処理しているようですが、先ほどの `:7` の返り値を指定することで、`$8`というローカル変数的な何かが返ってくるようです。
|
88
88
|
何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
|
89
89
|
|
90
|
-
|
90
|
+
## さらに追記
|
91
91
|
|
92
|
-
### さらに追記
|
93
|
-
|
94
92
|
`! $ ~` について参考になるものを見つけたので、追記します。
|
95
93
|
|
96
94
|
OpenOfficeのファイルですが、[phpopcodes_aug2008](https://wiki.php.net/_media/phpopcodes_aug2008.odp) にVLDに関しての記述があります。下記が引用です。
|
3
追記
answer
CHANGED
@@ -89,7 +89,7 @@
|
|
89
89
|
|
90
90
|
---
|
91
91
|
|
92
|
-
### 追記
|
92
|
+
### さらに追記
|
93
93
|
|
94
94
|
`! $ ~` について参考になるものを見つけたので、追記します。
|
95
95
|
|
@@ -111,7 +111,7 @@
|
|
111
111
|
> これなんなのかというと、通常のPHPの変数と同じものなんですが、$hogeみたいなPHPの変数はZendEngineのハッシュテーブルの中で管理されているのですが、ハッシュテーブルなので当然格納するときは変数名がハッシュ化されます。Compiled Variableとは、実行時に変数名をハッシュ化してオーバーヘッドにならないようにコンパイル時に予めハッシュ化されるPHPの変数ということがコードを読んでわかりました。
|
112
112
|
> 確かにPHPの変数名は実行時にならないとわからない場合もありますが、$hogeみたいなコードの場合はコンパイル時に変数名もわかっているわけなので予め変数名をハッシュ化しておいたほうがオーバーヘッドが少ないということなんでしょう。
|
113
113
|
|
114
|
-
まとめると下記のような感じかなと思います。(自信なし)
|
114
|
+
まとめると下記のような感じかなと思います。(自信なし^^;)
|
115
115
|
|
116
116
|
|記号|用語|意味|
|
117
117
|
|:--|:--|:--|
|
2
追記
answer
CHANGED
@@ -85,4 +85,36 @@
|
|
85
85
|
オペコード上ではインスタンスを作成するのにいくつか手順を踏むみたいです。
|
86
86
|
まず、`11 FETCH_CLASS` で `Gamma` というクラスを取得し、 `:7` を返しています。
|
87
87
|
次に `new Gamma` を処理しているようですが、先ほどの `:7` の返り値を指定することで、`$8`というローカル変数的な何かが返ってくるようです。
|
88
|
-
何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
|
88
|
+
何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
|
89
|
+
|
90
|
+
---
|
91
|
+
|
92
|
+
### 追記
|
93
|
+
|
94
|
+
`! $ ~` について参考になるものを見つけたので、追記します。
|
95
|
+
|
96
|
+
OpenOfficeのファイルですが、[phpopcodes_aug2008](https://wiki.php.net/_media/phpopcodes_aug2008.odp) にVLDに関しての記述があります。下記が引用です。
|
97
|
+
|
98
|
+
> ! == compiler variable
|
99
|
+
$ == variable
|
100
|
+
~ == temporary
|
101
|
+
|
102
|
+
この3つについて [第三回闇PHP勉強会開催した&PHPカンファレンスとPHPMatsuriで喋った](http://blog.anatoo.jp/entry/20121124/1353692635) に説明がありました。下記が引用です。
|
103
|
+
|
104
|
+
> ZendEngine内部で使われる変数の種類には以下の3つがあります。
|
105
|
+
>
|
106
|
+
> Variable 通常のPHPの変数
|
107
|
+
> Temporary variable ZendEngineないで利用される変数
|
108
|
+
> Compiled variable ?
|
109
|
+
>
|
110
|
+
> このうち、最初のVariableはPHPの$hogeみたいな通常の変数のことで、その次のTemporary VariableはZendEngine内部でのみ利用されるレジスタのような変数ということがわかっていたのですが、三番目のCompiled Variableというのが何のことがよくわかっていませんでした。
|
111
|
+
> これなんなのかというと、通常のPHPの変数と同じものなんですが、$hogeみたいなPHPの変数はZendEngineのハッシュテーブルの中で管理されているのですが、ハッシュテーブルなので当然格納するときは変数名がハッシュ化されます。Compiled Variableとは、実行時に変数名をハッシュ化してオーバーヘッドにならないようにコンパイル時に予めハッシュ化されるPHPの変数ということがコードを読んでわかりました。
|
112
|
+
> 確かにPHPの変数名は実行時にならないとわからない場合もありますが、$hogeみたいなコードの場合はコンパイル時に変数名もわかっているわけなので予め変数名をハッシュ化しておいたほうがオーバーヘッドが少ないということなんでしょう。
|
113
|
+
|
114
|
+
まとめると下記のような感じかなと思います。(自信なし)
|
115
|
+
|
116
|
+
|記号|用語|意味|
|
117
|
+
|:--|:--|:--|
|
118
|
+
|`!`|Compiled variable|ハッシュ化された変数|
|
119
|
+
|`~`|Temporary variable|ZendEngine内で利用される変数|
|
120
|
+
|`$`|Variable|通常の変数|
|
1
訂正
answer
CHANGED
@@ -77,9 +77,9 @@
|
|
77
77
|
|
78
78
|
|記号|意味|
|
79
79
|
|:--|:--|
|
80
|
-
|`!`|グローバル変数|
|
80
|
+
|`!`|グローバル変数?|
|
81
|
-
|`~`|計算結果(一時的な変数と呼んでいいのかな?)|
|
81
|
+
|`~`|計算結果?(一時的な変数と呼んでいいのかな?)|
|
82
|
-
|`$`|ローカル変数|
|
82
|
+
|`$`|ローカル変数?|
|
83
83
|
|
84
84
|
様々な変数をダンプしたら、新たに `:` という記号が出てきました
|
85
85
|
オペコード上ではインスタンスを作成するのにいくつか手順を踏むみたいです。
|