antonio's blog

antonio's blog


Блог о всяком разном, связанном с разработкой ПО. Пишу редко, когда есть время и желание.

Anton Dobkin
Author

Share


Tags


Разработка расширений для PHP. Данные и переменные. Часть 4

Anton DobkinAnton Dobkin

Для того чтобы получить данные переменной из пользовательского пространства необходимо осуществить её поиск в одной из таблиц символов . Так как таблица символов представляет из себя хэш-таблицу, то для поиска необходимо использовать функцию zend_hash_find() из семейства API функций работы с хэш-таблицами.

int zend_hash_find(HashTable *ht, char *arKey, uint nKeyLength, void **pDest) - функция поиска данных по ассоциативному индексу в хэш-таблице. Функция возвращает SUCCESS в случае успеха, иначе FAILURE.

Параметры функции:

Пример получения данных:

<?php  
  /* Переменная пользовательского пространства */
  $my_var = 'Test variable';
?>
/* Получение значения переменной $my_var из пользовательского пространства */
zval **myvar = NULL;  
if (zend_hash_find(&EG;(symbol_table), "my_var", sizeof("my_var"),  
    (void**)&myvar;) == SUCCESS) {
    zend_printf("The value of $my_var: ");
    ZEND_WRITE(Z_STRVAL_PP(myvar), Z_STRLEN_PP(myvar));
} else {
   zend_printf("$my_var is not defined.");
}

Более подробно функции API функции работы с хэш-таблицами будут рассмотрены в следующих постах.

Преобразование(конвертирование) данных

Для преобразования данных Zend Engine предоставляет функции семейства convert_to_*() и convert_to_*_ex():

Функции, на самом деле макросы, представленные ниже, отличаются от одноименных функций без суффикса _ex только тем, что вместо указателя на данные (zval *) они принимаю указатель на указатель (zval **):

Функции представленные ниже, отличаются от одноименных функций без префикса multi_ только тем, что могу выполнять преобразование неограниченного кол-ва данных. Первым аргументом функции принимают цело число указывающее кол-во конвертируемых данных. Последующими параметрами передаются данные, как и в случае с функциями с суффиксом _ex это указатель на указатель:

Пример преобразования данных:

<?php  
$str_var = 'Test variable';
$str_var2 = '25';
$srt_var3 = '96.6';
$int_var = 100;
$double_var = 36.6;
$null_str = NULL;
?>
/* Получение значения переменной $str_var из пользовательского
пространства  и преобразование к целочисленному числу */
zval **var = NULL;  
if (zend_hash_find(&EG;(symbol_table), "str_var", sizeof("str_var"), (void**)&var;) == SUCCESS) {  
  convert_to_long_ex(var);
  /* Выведет: Value of variable: 0 */
  zend_printf("Value of variable: %lu\n",  Z_LVAL_PP(var));
}

...

/* Получение значения переменной $str_var2 из пользовательского
пространства  и преобразование к целочисленному числу */
zval **var = NULL;  
if (zend_hash_find(&EG;(symbol_table), "str_var2", sizeof("str_var2"), (void**)&var;) == SUCCESS) {  
  convert_to_long_ex(var);
  /* Выведет: Value of variable: 25 */
  zend_printf("Value of variable: %lu\n",  Z_LVAL_PP(var));
}

...

/* Получение значения переменной $null_var из пользовательского
 пространства  и преобразование к целочисленному числу */
zval **var = NULL;  
if (zend_hash_find(&EG;(symbol_table), "null_var", sizeof("null_var"), (void**)&var;) == SUCCESS) {  
  convert_to_long_ex(var);
  /* Выведет: Value of variable: 0 */
  zend_printf("Value of variable: %lu\n",  Z_LVAL_PP(var));
}

...

/* Получение значения переменной $str_var из пользовательского
 пространства  и преобразование к булевому значению */
zval **var = NULL;  
if (zend_hash_find(&EG;(symbol_table), "str_var", sizeof("str_var"), (void**)&var;) == SUCCESS) {  
  сonvert_to_boolean_ex(var);
  /* Выведет: Value of variable: 1 */
  zend_printf("Value of variable: %i\n",  Z_BVAL_PP(var));
}

...

/* Получение значения переменной $str_var2 из пользовательского
 пространства  и преобразование к булевому значению */
zval **var = NULL;  
if (zend_hash_find(&EG;(symbol_table), "str_var2", sizeof("str_var2"), (void**)&var;) == SUCCESS) {  
  convert_to_boolean_ex(var);
  /* Выведет: Value of variable: 1 */
  zend_printf("Value of variable: %i\n",  Z_BVAL_PP(var));
}

...

/* Получение значения переменной $null_var из пользовательского
 пространства  и преобразование к булевому значению */
zval **var = NULL;  
if (zend_hash_find(&EG;(symbol_table), "null_var", sizeof("null_var"), (void**)&var;) == SUCCESS) {  
  convert_to_boolean_ex(var);
  /* Выведет: Value of variable: 0 */
  zend_printf("Value of variable: %i\n",  Z_BVAL_PP(var));
}
...

/* Получение значения переменной $str_var3 из пользовательского
 пространства  и преобразование к целочисленному числу */
zval **var = NULL;  
if (zend_hash_find(&EG;(symbol_table), "str_var3", sizeof("str_var3"), (void**)&var;) == SUCCESS) {  
  convert_to_long_ex(var);
  /* Выведет: Value of variable: 96 */
  zend_printf("Value of variable: %lu\n",  Z_LVAL_PP(var));
}

...

/* Получение значения переменной $str_var3 из пользовательского
 пространства  и преобразование к числу с плавающей запятой */
zval **var = NULL;  
if (zend_hash_find(&EG;(symbol_table), "str_var3", sizeof("str_var3"), (void**)&var;) == SUCCESS) {  
  convert_to_double_ex(var);
  /* Выведет: Value of variable: 96.600000 */
  zend_printf("Value of variable: %f\n",  Z_DVAL_PP(var));
}
Anton Dobkin
Author

Anton Dobkin

Comments