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 9