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 Introducción a la Cuenta de Referencias 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
.