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