変数の作成
PHP Manual

導入

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 の型のなかでここに登場していないものもあります。 NULLboolean、そして resources です。 NULL については値は不要です。NULL がこの型の値となるからです。 booleanresource については、PHP が value フィールドを再利用します。 boolean 型の場合、false なら 0true なら 1 を保持します。 resource 型の場合は、リソース id を保持します。

良いお知らせです。このあたりの事情についての詳しい知識は不要です。 というのも、アクセス用のマクロがきちんと用意されているからです (PHP にはよくあることでず)。 悪いお知らせです。マクロは膨大な数にのぼります。 zval をいろいろな方面から使うマクロだけでなく zval へのポインタを扱うマクロもあり、さらには zval のポインタへのポインタを扱うためのマクロや ポインタの参照先を操作するためのショートカットまで存在します。 これらのマクロが定義されているのは Zend/zend.hZend/zend_operators.h そして Zend/zend_API.h です。


変数の作成
PHP Manual