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
です。