PHP コアで変数を扱うには、PHP で使われるさまざまな基本概念を身につける必要があります。 まず最初に、PHP は動的で弱い型付けの言語です。 次に、PHP は copy on write 方式と参照カウントを使ってメモリを管理しています。 参照カウント方式と参照の挙動についての詳細は 参照カウント法の原理 の章を参照ください。
PHP の変数は、二つの部分で構成されています。 シンボルテーブル内でのエントリとして用いられる「ラベル」と、 実際の値を格納する「変数コンテナ」です。ここでは、主に変数コンテナについて扱います。
変数コンテナは実際のコードの中では zval と呼ばれ、
変数を処理するために必要なすべてのデータを保持しています。
値そのもののほかにも、現在の型、そのコンテナを指すラベルのカウンタ、
ラベルを参照として扱うかコピーとして扱うかを示すフラグなどが含まれます。
PHP 5.3 では、それに関連する構造体が
Zend/zend.h で次のように定義されています。
typedef struct _zval_struct zval;
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct { /* string type */
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
zvalue_value を見れば、
内部的に使う型やフィールドがその名前とコメントから読み取れるでしょう。
PHP の配列が実際のところはハッシュテーブルであることなどもわかります。
とはいえ、PHP の型のなかでここに登場していないものもあります。
NULL や boolean、そして resources です。
NULL については値は不要です。NULL がこの型の値となるからです。
boolean と resource については、PHP が
value フィールドを再利用します。
boolean 型の場合、false なら
0、true なら 1 を保持します。
resource 型の場合は、リソース id を保持します。
良いお知らせです。このあたりの事情についての詳しい知識は不要です。
というのも、アクセス用のマクロがきちんと用意されているからです
(PHP にはよくあることでず)。
悪いお知らせです。マクロは膨大な数にのぼります。
zval をいろいろな方面から使うマクロだけでなく
zval へのポインタを扱うマクロもあり、さらには
zval のポインタへのポインタを扱うためのマクロや
ポインタの参照先を操作するためのショートカットまで存在します。
これらのマクロが定義されているのは Zend/zend.h、
Zend/zend_operators.h そして Zend/zend_API.h
です。