Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera tudo beleza
Qual real diferença desses operadores de comparação logo abaixo:
=== para esse ==
!== para esse !=
sempre usar ( === !== ) em vez de ( == != ) na comparações, ou há exceções?
Sempre há exceções de uso.
Os operadores == ou != testam apenas os valores.
Comparações como:
1 == 1;// true
1 == '1';// true
10 == '10';// true
false == 0;// true
true == 1;// true
true != 'true';//false
1 != '1';// false
Já === ou !== testam o valor e o tipo. Comparações como:
1 === 1;// true
1 === '1';// false
10 === '10';// false
false === 0;// false
true === 1;// false
true !== 'true';// true
1 !== '1';// true
sempre usar ( === !== ) em vez de ( == != ) na comparações, ou há exceções?
Use === sempre que os valores tiverem que ser iguais e de mesmo tipo...
Use === sempre que os valores tiverem que ser iguais e de mesmo tipo...
Em qual situação rotineira, terei que saber se os valores são iguais e de mesmo tipo?
Já que esse comparador === faz o trabalho de verificar se os valores são iguais e de mesmo tipo, por que não sempre usar ele, em vez desse == que só verifica somente se o valor é igual?
Já que esse comparador === faz o trabalho de verificar se os valores são iguais e de mesmo tipo, por que não sempre usar ele, em vez desse == que só verifica somente se o valor é igual?
Porque, por exemplo, array(), 0, "" e null podem ser comparadas como false em qualquer um desses casos.
Exemplo,
um registro no banco de dados retorna (int)0 resultados:
if( $dados == false )
{
// isso funciona
}
Se você fizesse com ===, cairia no ELSE e não no IF a sua condição.
interessante que === pode ser usado para comparar se os arrays tem os mesmos valores;
var_dump(array('isso', 'isso', 'aquiloutro') === array('isso', 'isso', 'aquiloutro')); // bool(true)
Algo que acontece, e muito, é o uso de strpos para identificar parte de uma palavra em uma string.
Lendo o manual fica fácil entender o comportamento da função:
Find the position of the first occurrence of a substring in a string. [...] Returns the position of where the needle exists relative to the beginning of the haystack string. [...] Returns FALSE if the needle was not found.
Encontra e retorna a posição de needle. Caso não encontrar, retorna false.
Como a primeira posição é zero, e zero é diferente de false, eu criei a lógica para retornar se uma palavra for encontrada na string.
var_dump(strpos("Hello, World!" , "Hello") >= 0);//Retorna a posição 0 -> true
Entretanto, quando retorna false, o cast type retorna o resultado como true:
var_dump(strpos("Hello, World!" , "Something") >= 0);//Something não existe na string, retorna false, resultado do var_dump é true
Agora sabemos que dessa maneira não funciona. Vamos verifiacar o que e diferente de false então:
var_dump(strpos("Hello, World!" , "World") != false);//Retorna a posição 7 -> true
var_dump(strpos("Hello, World!" , "Something") != false);//Retorna false -> false
var_dump(strpos("Hello, World!" , "Hello") != false);//Retorna a posição 0 -> false
Os dois primeiros testes, funcionam, retornando, respectivamente, true e false. Entretanto, o terceiro teste, deveria retornar true, mas está retornando false.
Na análise, a posição retornada é 0. Utilizando o cast type do PHP, 0 é igual a false, logo, essa abordagem também não funciona.
Para evitar esse problema, deve-se, portanto, verificar, além do valor, o tipo retornado.
var_dump(strpos("Hello, World!" , "World") !== false);//Retorna a posição 7 -> true
var_dump(strpos("Hello, World!" , "Something") !== false);//Retorna false -> false
var_dump(strpos("Hello, World!" , "Hello") !== false);//Retorna a posição 0 -> true
Enfim, obtivemos os valores corretamente retornados.
Resumidamente seria.
!== e === seria comparação idêntica até o tipo usado.
!= e == comparação se são iguais não verificando o tipo utilizado.
'1' == true , neste caso seria verdade
'1' === true, neste caso seria falso, como informado acima, os valores ou neste caso a lógica confere, mas a maneira de comparação foi para verificar se o valor e tipo são iguais, neste caso, seria falso.
RTFM:
http://php.net/manual/pt_BR/language.operators.comparison.php