For working with variables in PHP's core you have to learn about different fundamental concepts used in PHP. Firstly PHP is a dynamic and weak typed language. Secondly PHP uses a copy on write mechanism with reference counting for memory handling. Please check the Reference Counting Basics chapter for details how reference counting and references work.
PHP variables, in general, consist out of two things: The label, which might, for instance, be an entry in a symbol table, and the actual variable container. For the most parts of this manual we will focus on the variable container.
The variable container, in code called zval
, is holding all
data needed to handle the variable. This includes not only the actual value
but also the current type, a counter counting the number of labels pointing
to this container and a flag whether these labels should be treated as
references or copies. In PHP 5.3 the relevant structures, which you can
find in Zend/zend.h
, look like this:
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; };
In the zvalue_value
one can find the internal representation
for the different types the fields used should be clear from the names and
comments - especially if one knows that PHP's arrays are infact hash
tables. Nonetheless, knowing PHP's types one might miss a few:
NULL
, boolean
and resources
. For
NULL
we need no value, as NULL
is the value of
that type. For boolean
and resource
values PHP
re-uses the value field. In the case of a boolean
it holds
either 0
for false
or 1
for
true
. For resource
-typed variables it holds the
resource id.
Now the good message is that you don't have to know these things in detail
as there are - like always in PHP - acces macros. The bad news is that there
are many of them: There are macros to access any aspect of the
zval
and then, as one often deals with pointers to
zval
s and even pointers to pointers to zval
s, for
most of them there are shortcuts dereferencing these pointers. These macros
are spread over Zend/zend.h
,
Zend/zend_operators.h
and Zend/zend_API.h
.