Erick Tedeschi Tecnologia legal e um pouco de FOSS

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!

Comentários (0) Trackbacks (0)

Sem comentários


Leave a comment

(required)


*

Sem trackbacks