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