O assunto a falarmos aqui é bem básico, mas confunde muita gente, principalmente os iniciantes no PHP.
Você pode recaptular o funcionamento da função strpos lendo .
Todos sabemos que a função strpos do PHP serve para nos informar qual a posição numérica de determinado caractere ou string dentro de outra string. A confusão mesmo acontece quando tratamos o retorno dessa função.
A função strpos retorna o número da posição do texto em que a string procurada é encontrada, e a numeração de posições inicia-se em zero; caso não seja encontrada, FALSE é retornado.
Até aqui tudo bem, nada demais. Porém veremos o que acontece se executarmos uma das seguintes instruções de exemplo:
<?php
$stringBase = 'Ser Programador te ajuda a obter sucesso!';
$stringPesquisa = 'Ser Programador';
$posicao = strpos($stringBase, $stringPesquisa);
if ($posicao) {
echo $stringPesquisa . ' foi encontrado na string';
} else {
echo $stringPesquisa . ' NÃO foi encontrado na string';
}
<?php
$stringBase = 'Ser Programador te ajuda a obter sucesso!';
$stringPesquisa = 'Ser Programador';
$posicao = strpos($stringBase, $stringPesquisa);
if ($posicao == FALSE) {
echo $stringPesquisa . ' NÃO foi encontrado na string';
} else {
echo $stringPesquisa . ' foi encontrado na string';
}
Os exemplos acima irão apresentar que a string pesquisada NÃO foi encontrada, mesmo ela existindo.
Por que isso acontece?
A primeira impressão pode ser de que o PHP tem um bug, mas este comportamento está completamente correto. A questão aqui é que a string pesquisada existe na primeira posição, logo a função strpos retornará zero.
O IF apenas compara o resultado de expressões, ou seja, somente trabalha com TRUE ou FALSE. Ao fornecer zero para o IF, que é um retorno positivo esperado da função strpos, o zero será interpretado como FALSE e irá entregar um resultado que não é esperado.
Para resolver o problema basta usarmos no IF um comparador que verifica o valor e o tipo do dado. Este verificador é o "===" (três iguais).
Ao executar a seguinte instrução:
<?php
var_dump(0 === FALSE);
O retorno será:
bool(false)
Isso acontece porque apesar de zero e FALSE serem teoricamente a mesma coisa, eles não são do mesmo tipo.
Tendo isso em mente, podemos modificar o script:
<?php
$stringBase = 'Ser Programador te ajuda a obter sucesso!';
$stringPesquisa = 'Ser Programador';
$posicao = strpos($stringBase, $stringPesquisa);
if ($posicao === FALSE) {
echo $stringPesquisa . ' NÃO foi encontrado na string';
} else {
echo $stringPesquisa . ' foi encontrado na string';
}
Dessa forma, se o valor retornado pela função e armazenado na variável $posicao for igual e do mesmo tipo que FALSE, apresenta a mensagem negativa.
Podemos também utilizar o sinal "!==", que é o inverso de "===". Vejamos:
<?php
$stringBase = 'Ser Programador te ajuda a obter sucesso!';
$stringPesquisa = 'Ser Programador';
$posicao = strpos($stringBase, $stringPesquisa);
if ($posicao !== FALSE) {
echo $stringPesquisa . ' foi encontrado na string';
} else {
echo $stringPesquisa . ' NÃO foi encontrado na string';
}
Ao utiliza-lo (sinal "!=="), estamos literalmente verificando se os valores NÃO são iguais ou NÃO são do mesmo tipo.
