Ser Programador

Por que a função strpos no PHP não funciona?

Neste artigo vamos abordar uma regra conflitante específica da função strpos do PHP.


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.