Creating Variables
As we saw in the previous section, the symbol_table and active_symbol_table hashes contain
user-accessible variables. You can inject new variables or change
existing ones in these hashes.
Here is a trivial function that, when called, creates $foo with a value of 99 in the currently
active symbol table:
PHP_FUNCTION(foo)
{
zval *var;
MAKE_STD_ZVAL(var);
Z_LVAL_P(var)=99;
Z_TYPE_P(var)=IS_LONG;
ZEND_SET_SYMBOL(EG(active_symbol_table), "foo", var);
}That means that if this function was called from within a
user-space function, the variable would be injected into the
function-local symbol table. If this function was called from the global
scope, the variable would, of course, be injected into the global symbol
table. To inject the variable directly into the global symbol table
regardless of the current scope, simply use EG(symbol_table) instead of EG(active_symbol_table). Note that the global
symbol table is not a pointer.
Here we also see an example of manually setting the type of a container and filling in the corresponding long value. The valid container-type constants are:
#define IS_NULL 0
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_STRING 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_BOOL 6
#define IS_RESOURCE 7
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY 9The ZEND_SET_SYMBOL( ) macro is somewhat complex. It first checks to see if the symbol you are setting is already there and if that symbol is a reference. If so, the existing container is reused ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access