Tutte le macro utilizzate per impostare e recuperare i valori accettano come primo parametro un puntatore a zval (estratto facendo precedere la variabile contenente lo zval da un asterisco).
Una nuova variabile di tipo zval può essere creata attraverso la macro MAKE_STD_ZVAL, che si occupa dell'allocazione e dell'inizializzazione. Questi valori sono disponibili solamente all'interno del modulo C che definisce l'estensione. È possibile rendere globale o inserire una variabile nello scope corrente del blocco di codice che richiama la nostra estensione utilizzando la macro ZEND_SET_SYMBOL. Questa macro permette di accedere in modo trasparente la tabella dei simboli locale o globale, modificando il valore di un determinato simbolo:
PHP_FUNCTION(set_variable)
{
zval **parameters[2];
zval *value;
char* str;
argc = ZEND_NUM_ARGS();
if(arc != 2)
{
WRONG_PARAM_COUNT;
}
if(zend_get_parameters_array_ex(argc, parameters) != SUCCESS)
{
WRONG_PARAM_COUNT;
}
str = Z_STRVAL(*(parameters[0]));
value = *(parameters[1]);
ZEND_SET_SYMBOL(EG(active_symbol_table), str, value);
RETURN_NULL();
}
La funzione qui definita lavora assegnando ad una variabile chiamata con la stringa passata come primo argomento il valore passato come secondo:
<?php
$my_var = 10;
echo "Il valore di $my_var è: ", $my_var, "<br>";
set_variable("my_var", 100);
echo "Il valore di $my_var è: ", $my_var, "<br>";
?>
Al fine di salvare la variabile nel namespace globale, è possibile utilizzare &EG(symbol_table) anziché EG(active_symbol_table). Bisognerà comunque assicurarsi che il nome utilizzato nella tabella dei simboli globali sia importato precedentemente utilizzando la parole chiave global.
Una volta che si ha a disposizione uno zval, è possibile modificare il suo tipo ed il suo valore attraverso un apposito le macro sopra riportate. È da ricordare che le macro ZVAL_STRING e ZVAL_STRINGL accettano come ultimo parametro un valore che indica se effettuare la copia della stringa passato o se salvarne solamente un riferimento.
Spesso risulta necessario conoscere il valore contenuto da uno zval. Questo può avvenire in quei casi in cui all'utente è lasciata la possibilità di passare valori di diverso tipo, oppure quando lo zval ci proviene da una funzione che restituisce un oggetto che può avere valori differenti. In questo caso ci viene in aiuto la macro Z_TYPE, che restituisce il tipo contenuto nello zval passato come argomento. I possibili valori restituiti sono accessibili attraverso queste macro autoesplicative:
- IS_NULL;
- IS_LONG;
- IS_DOUBLE;
- IS_STRING;
- IS_ARRAY;
- IS_OBJECT;
- IS_BOOL;
- IS_RESOURCE;
- IS_CONSTANT;
- IS_CONSTANT_ARRAY;