29mar/100
Comparando tipo e valor entre zvals
Outro dia precisei fazer uma comparação idêntica entre zval's como no seguinte exemplo em UserSpace:
<?php
$a = "10";
$b = 10;
if ($a === $b) {
echo "Identico";
} else {
echo "Diferente";
}
?>
Então comecei fazendo com um switch(Z_TYPE_P(zval1)) { case IS_LONG...... e por aí vai... o código estava ficando enorme. Resolvi parar de perder tempo e pesquisar a API.
Na API encontrei a função is_identical_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) que faz a comparação das zval's op1 e op2 e coloca o resultado na zval result que por sua vez é do tipo IS_BOOL.
Exemplo de utilização da função:
PHP_FUNCTION(teste_identical)
{
zval result;
zval *a = NULL;
zval *b = NULL;
/* Inicializando a e b */
MAKE_STD_ZVAL(a);
MAKE_STD_ZVAL(b);
/* Atribuindo valores para a e b */
ZVAL_STRING(a, "10", 1); /* valor de a é "10" (IS_STRING) */
ZVAL_LONG(b, 10); /* valor de b é 10 (IS_LONG) */
/* Faz a comparação entre as zval's */
is_identical_function(&result, a, b TSRMLS_CC);
/* limpando memória, pois o resultado já está em result */
efree(a);
efree(b);
/* agora que o resultado da comparação está em result podemos verificar */
if (Z_BVAL(result)) {
php_printf("eh identico\n");
} else {
php_printf("nao eh identico\n");
}
}
Bom, essa é uma dica... e outras virão em próximos posts!




