Operador de comparação idêntico ===

Há muito tempo vejo em códigos fonte de frameworks o operador ===. De início foi difícil saber o que ele fazia, afinal o google bloqueia pesquisa com este operador. A questão é, qual é seu nome? Então após uma necessidade específica em PHP, finalmente descobri qual é seu nome o que faz.

O operador idêntico serve para fazer comparações de igualdade de tipos de dados. Linguagens como PHP tratam o 0 como um valor boleano falso. Inicialmente vamos analisar alguns retornos de conversões boleanas em php:

<?php
    var_dump((bool) "");        // bool(false)
    var_dump((bool) 1);         // bool(true)
    var_dump((bool) -2);        // bool(true)
    var_dump((bool) "foo");     // bool(true)
    var_dump((bool) 2.3e5);     // bool(true)
    var_dump((bool) array(12)); // bool(true)
    var_dump((bool) array());   // bool(false)
    var_dump((bool) "false");   // bool(true)
?>

Quando convertidas para boleanos, os seguintes valores são considerados FALSE:

  • O próprio FALSE boleano
  • O inteiro 0 (zero)
  • o float 0.0 (zero)
  • Uma string vazia, e a string “0”
  • Um array com zero elementos
  • O tipo especial NULL (incluindo variáveis passadas por unset)
  • Objetos PHP SimpleXML criados de tags vazias

Certo, agora imaginemos que temos uma função que retorna um índice de um array como resultado de seu processamento. Por exemplo a função php array_search. Esta função retornará o índice do array que corresponde ao valor encontrado, ou então false se não encontrar nada.

Ok, mas e digamos que o valor encontrado esteja no primeiro índice, o índice 0. Qual é a diferença da conversão boleana de 0 e FALSE? Como vimos acima, os dois serão tratados como false. Vamos a um exemplo. Suponhamos um array de 3 elementos:

/*
 * PHP faz a inicalização de índices automaticamente,
 * portanto Número terá índice 0, Nome índice 1 e assim por diante
 */
$campos = array(
    'Número',
    'Nome',
    'Endereço'
);

Agora, faremos uma pesquisa nesse array para procurar o valor ‘Número’:

/*
 * array_search neste exemplo retornará o índice 0 e como o operador de condição
 * if age sob valores boleanos, o 0 será convertido para false, logo receberemos
 * a informação de que não foi encontrado o valor, que difere do real resultado
 * vindo da função array_search.
 */
if (array_search('Número', $campos))
    echo 'Valor encontrado';
else
    echo 'Valor não encontrado';

Como explicado nos comentários acima, a função array_search irá retornar 0, que é o índice do primeiro elemento do array. E a verificação feita desta maneira (boleana) irá escrever ‘Valor não encontrado’ na tela, pois o 0 será convertido para false.

Mudando um pouco nossa condição agora, teremos o resultado desejado:

if (array_search('Número', $campos) === false)
    echo 'Valor não encontrado';
else
    echo 'Valor encontrado';

Aqui usei o comparador idêntico, que irá verificar se o valor retornado por array_search é igual (do mesmo tipo) à  false. Qualquer coisa diferente disto, incluindo 0, será considerada diferente de false, fazendo com que a sentença retorne verdadeiro. Logo, o retorno 0 da função array_search é considerado um índice pelo nosso programa, informando ao usuário de que o valor pesquisado foi encontrado.

Para deixar o “programa” um pouco mais interativo, podemos informar ao usuário em qual índice o valor foi encontrado:

$campos = array(
    'Número',
    'Nome',
    'Endereço'
);
 
$indice = array_search('Número', $campos);
 
if ($indice !== false)
    echo 'Valor encontrado no indice '. $indice;
else
    echo 'Valor não encontrado';

Como podemos ver, usei outro operador, o operador não idêntico aqui. Ele garante que o $indice contém um valor diferente do tipo false.

Em frameworks, eles fazem um uso bem interessante deste operador. Um exemplo seria o seguinte código:

$campos = array(
    'Número',
    'Nome',
    'Endereço'
);
 
if (false !== $indice = array_search('Número', $campos))
    echo 'Valor encontrado no indice '. $indice;
else
    echo 'Valor não encontrado';

O exemplo acima faz exatamente o proposto do exemplo anterior, porém de forma “mais elegante”.

Fica aqui a dica para trabalhar com o operador idêntico que é muito encontrado em frameworks PHP. Espero ter sido tão claro quanto possível.

referências:

http://www.php.net/manual/en/language.types.boolean.php

http://php.net/manual/en/function.array-search.php

http://www.php.net/manual/en/language.operators.comparison.php

Leave a Reply