Quando usar == ou === em php?

Quando trabalhamos com comparações em PHP a grande maioria das vezes utilizamos o operador igual (==) para saber se nossos valores são iguais. Mas, nem sempre utilizar o == é a escolha certa pro nosso problema. Afinal de contas, quando devemos ou não usar o operador identico (===)? Pra que serve esse operador de comparação? Qual a diferença entre eles?

Ao trabalhar com formulários, é comum a necessidade de validar um email e não existe uma forma padrão de fazer isso. Existem diversas regras de , por exemplo, que haja algo escrito antes do @. Uma forma de verificar isso é usando a função strpos que verifica a posição da primeira ocorrencia de uma string:

public function validaEmail($email)
{
    $posicao = strpos($email,@) ;

    if($posicao == 0) {
        //exibe uma menssagem de erro pra view dizendo que faltou a conta
    }
}

Mas, caso o usuario não digite nem o @ precisamos, também, dizer que aquele campo é especifico para email! No caso de não haver ocorrencia de string, a função strpos() retorna null. Portanto, para validar, também, este caso teriamos:

public function validaEmail($email)
{
    $posicao = strpos($email,@) ;

    if($posicao == 0) {
        //exibe uma menssagem de erro dizendo que faltou a conta//
    }
    if($posicao == null) {
        //exibe uma menssagem de erro dizendo que aquele campo é especifico para email//
		}
}

Beleza, nossa lógica faz todo sentido! se o @ estiver na posição 0 da string $email falamos que faltou a conta. Se não houver @ na variavel $email exibimos outra mensagem dizendo que nosso usuario preencheu o campo errado!

Mas, se rodarmos esse código, as duas menssagens serão exibidas!

Isso acontece porque, na tabela de comparação de tipos do php o valor 0 é igual a null! Precisamos, de alguma forma, comparar valores de uma forma mais especifica onde o tipo faça diferença. Neste caso, 0 seria apenas um inteiro qualquer, não outra representação de null.

E é aqui que devemos usar o operador identico ===! Com este operador, diferente do ==, levamos em conta não só o valor mas também o tipo na hora da comparação.

Então, nossa validação de email deve ser escrita um pouco diferente:

public function validaEmail($email)
{
    $posicao = strpos($email,@) ;

    if($posicao === 0) {
        //exibe uma menssagem de erro dizendo que faltou a conta//
    }
    if($posicao === null) {
        //exibe uma menssagem de erro dizendo que aquele campo é especifico para email//
		}
}

Agora sim somente uma menssagem será exibida. Se a posição for zero, mostramos a menssagem dizendo que faltou a conta. Se não houver @ mostramos a menssagem dizendo que o campo é especifico para email.

Uma pequena diferença de tipos, pode causar um grande impacto nas funcionalidades do nosso sistema.

E você? O que achou do operador identico? Compartilhe com a gente sua opinião!

Para saber mais conceitos em php, faça a carreira de desenvolvedor php junior da Alura!


  • Oi, gostei do artigo. Acredito que o objetivo de demostrar a diferença entre os operadores tenha sido alcançado, mas tenho uma dúvida. A função filter_var não é a forma padrão de lidar com esse tipo de validação?

  • andré Chaves

    Obrigado Paulo! No post utilizei um exemplo de validação básico. Estamos apenas verificando a existencia do caracter @. Porém, realmente é muito comum precisarmos verificar, por exemplo, a unicidade deste caracter. Neste caso, poderiamos utilizar a função filter_var($email, FILTER_VALIDATE_EMAIL). Mas a coisa pode ficar um pouco mais complicada, por exemplo:

    meuemail’com’aspas@host.com (aspas simples em email)

    admin@meuservidordeemail (dominio local sem TLD)

    ou, até mesmo:

    Sören@Österreich.de (unicode alemão)

    É facil perceber que a coisa pode ficar ainda mais complicada que isso. Mas, nestes 3 exemplos, se utilizarmos a função filter_var, teremos os respectivos retornos:

    meuemail’com’aspas@host.com (TRUE, mas não deveria passar)

    admin@meuservidordeemail (FALSE, mas dominios locais sem TLD existem)

    Sören@Österreich.de (FALSE, mas unicode alemão também existe)

    Pela documentação do PHP, essa função é a indicada para validação de email. E, realmente, para as validações mais comuns funciona muito bem. Mas, não existe realmente uma forma padrão de lidar com isso.

    Espero ter solucionado sua duvida =)

Próximo ArtigoAngular 2.0 final é lançado