🎯Raio-X do Marketing Digital: Tendências e desafios 🚀

Guia Prático Sobre Debugging com var_dump() e Xdebug no PHP

Leia o artigo e entenda como utilizar as ferramentas de depuração var_dump() e Xdebug no PHP para identificar e corrigir erros no seu código.
Publicado em 11/09/2024

Atualizado em 18/09/2024
Guia Prático Sobre Debugging com var_dump() e Xdebug no PHP

Depurar código é uma parte essencial do desenvolvimento de software, especialmente em linguagens dinâmicas como PHP. Entre as ferramentas mais comuns para esse propósito estão o var_dump() e o Xdebug, que ajudam pessoas desenvolvedoras a entender o comportamento do código e a identificar onde os problemas estão ocorrendo.

No PHP, o var_dump() é amplamente utilizado por sua simplicidade e eficácia, enquanto o Xdebug oferece recursos avançados para uma análise mais profunda. Quer saber mais sobre estes recursos? Continue a leitura deste artigo e confira:

  • o que é debug e por que ele é importante;
  • como usar o var_dump() no PHP;
  • como utilizar o Xdebug para depuração avançada no PHP.

O que é debug e por que ele é importante?

No contexto do PHP, onde o código é interpretado em tempo real, podem surgir erros que não são detectados até o momento da execução. É aqui que o debug se torna essencial, permitindo que os desenvolvedores inspecionem o código, entendam o fluxo de execução e corrijam quaisquer problemas encontrados.

Sendo assim, ferramentas de debug ajudam a monitorar partes específicas do código, permitindo que a pessoa desenvolvedora identifique a causa raiz de um problema. Para isso, é preciso ativar o display_errors no php.ini e deixar como padrão “mostrar todos os erros”. Caso contrário, a tela aparecerá em branco em exceções geradas pela aplicação e não será possível ver o erro na tela.

Na KingHost, para ativar essas configurações para sua aplicação, basta seguir o passo a passo:

  1. acessar o Painel de Controle;
  2. selecionar o seu Domínio;
  3. configuração PHP;
  4. ativar display_errors.

Quanto ao reporte de erros, adicione o código error_reporting(E_ALL); no arquivo global de sua aplicação. Vamos considerar como exemplo o pequeno trecho de código abaixo:

<?php

class Cachorro {

    private $raca;

    private $nome;

    public function __construct()

    {

    $this->raca = ‘Poodle’;

    $this->nome = ‘Bob’;

    }

    public function setRaca($raca)

    {

    $this->raca = $raca;

    }

    public function setNome($nome)

    {

    $this->nome == $nome;

    }

    public function getInformacoes()

    {

    return “Meu cachorro é da raça {$this->raca} e o nome dele é {$this->nome}”;

    }

}

$cachorro = new Cachorro();

$cachorro->setRaca(‘Dogue Alemão’);

$cachorro->setNome(‘Scooby’);

echo $cachorro->getInformacoes();

O exemplo consiste em uma classe simples chamada Cachorro, que tem as funções de setar o nome (setNome) e a raça (setRaca).

Há também uma função para disponibilizar as informações do cachorro na tela (getInformacoes) e, caso não sejam setadas a raça ou o nome do cachorro, ele tem um construtor para definir os valores padrão “Poodle” para raça e “Bob” para o nome.

Ao acessar o nosso código no navegador ou por um terminal veremos que o retorno é: “Meu cachorro é da raça Dogue Alemão e o nome dele é Bob”. Colocamos o nome Scooby com a função setNome, lembra-se? Então, vamos aplicar o debug nesta aplicação.

Sempre temos que pensar em fazer a engenharia reversa, ou seja, quem está aparecendo errado? O nome! Então vamos primeiro ver qual é a função que me retorna as informações do cachorro:

 public function getInformacoes()

    {

    return “Meu cachorro é da raça {$this->raca} e o nome dele é {$this->nome}”;

    }

Temos que entender primeiramente o que esta função básica faz: retorna uma string e, dentro dela, imprime os valores da raça e do nome deste objeto que está instanciado.

Como usar o var_dump() no PHP?

O var_dump() é uma função nativa do PHP que exibe informações detalhadas sobre uma variável, incluindo seu tipo e valor. Por exemplo, ao aplicar var_dump($variavel);, o PHP retorna detalhes como o tipo da variável (inteiro, string, array, etc.) e seu conteúdo.

Essa função é especialmente útil para visualizar o estado das variáveis em diferentes pontos do código, o que ajuda a identificar onde algo pode estar dando errado.

Retomando o nosso exemplo, se o nome está sendo impresso de forma errada, vamos matar a aplicação, antes de retornar a string completo e pedir para mostrar somente o valor do nome:

public function getInformacoes()

    {

    var_dump($this->nome);exit;

    return “Meu cachorro é da raça {$this->raca} e o nome dele é {$this->nome}”;

    }

A função var_dump, se traduzirmos livremente, “despejar variável”, faz exatamente isso: nos mostra todas as informações salvas dentro desta variável. Já a função exit, mata o script e não deixa mais nada ser executado. Então, se acessarmos a aplicação novamente, teremos o resultado impresso:

string(3) “Bob”

Se o nome está sendo impresso corretamente e não está sendo alterado antes de retornar à string, então temos que analisar onde está sendo setado este nome. Para isso, apague o var_dump e exit da função getInformacoes() e vamos analisar a função setNome():

    public function setNome($nome)

    {

    $this->nome == $nome;

    }

Primeiramente vamos verificar se estamos recebendo o parâmetro correto:

public function setNome($nome)

    {

    var_dump($nome);exit;

    $this->nome == $nome;

    }

O resultado da aplicação:

string(6) “Scooby”

Estamos recebendo corretamente o valor do parâmetro, então, conseguimos ver que o erro está no momento em que atribuímos este valor à propriedade nome do objeto:

public function setNome($nome)

    {

    $this->nome == $nome;

    }

Encontramos o erro! Nesta função, estamos utilizando o símbolo de comparação (==), comparando a propriedade nome do objeto instanciado, cujo valor padrão é ‘Bob’, com o que estamos recebendo por parâmetro. Para solucionar, basta arrumarmos isto na função:

  public function setNome($nome)

    {

    $this->nome = $nome;

    }

E, ao acessarmos, teremos o resultado esperado:

“Meu cachorro é da raça Dogue Alemão e o nome dele é Scooby”

Este caso é simples, mas a técnica de var_dump + exit pode ser utilizada para investigar qualquer tipo de aplicação.

Vamos para outro caso:

class Cachorro {

    private $raca;

    private $nome;

    public function __construct()

    {

    $this->raca = ‘Poodle’;

    $this->nome = ‘Bob’;

    }

    public function setRaca($raca)

    {

    $this->raca = $raca;

    }

    public function setNome($nome)

    {

    $this->nome = $nome;

    }

    public function getInformacoes()

    {

    return “Meu cachorro é da raça {$this->raca} e o nome dele é {$this->nome}”;

    }

}

$cachorro = new Cachorro();

$cachorro->setRaca(‘Dogue Alemão’);

$cachorro->setName(‘Scooby’);

echo $cachorro->getInformacoes();

Ao acessarmos este script:

Uncaught Error: Call to undefined method Cachorro::setName()

Podemos continuar utilizando a função ‘echo’ para imprimir uma mensagem de qual passo da aplicação estamos e ir matando ela até encontrar onde está o erro. Por exemplo:

$cachorro = new Cachorro();

echo ‘Instanciei um objeto cachorro’;exit;

$cachorro->setRaca(‘Dogue Alemão’);

$cachorro->setName(‘Scooby’);

echo $cachorro->getInformacoes();

Ao acessarmos a aplicação, veremos que a mensagem “Instanciei um objeto cachorro” é mostrada, indicando que não é um erro na hora de instanciar o objeto. Continuando:

$cachorro = new Cachorro();

$cachorro->setRaca(‘Dogue Alemão’);

die(‘Informei a raca do meu cachorro’);

$cachorro->setName(‘Scooby’);

echo $cachorro->getInformacoes();

A função die, matar em inglês, é a junção da função echo com exit. Basta passar como parâmetro a mensagem que queremos disponibilizar, a mensagem é mostrada e o script morto. Ao acessarmos a aplicação, veremos a mensagem “Informei a raça do meu cachorro”. Mais uma vez:

$cachorro = new Cachorro();

$cachorro->setRaca(‘Dogue Alemão’);

$cachorro->setName(‘Scooby’);

die(‘setei o nome do cachorro’);

echo $cachorro->getInformacoes();

Neste momento, se acessarmos a aplicação, veremos novamente:

Call to undefined method Cachorro::setName()

Então, conseguimos identificar que o erro está no nome da função. Como diz o erro, “Call to undefined method Cachorro::setName()”, Chamada para um método não definido Cachorro::setName(), pois o nome da função na verdade é setNome().

Alterando o nome da função, a aplicação volta a funcionar normalmente, e o mesmo procedimento pode ser utilizado para depurar aplicações que utilizam algum framework MVC, algum CMS como WordPress ou Magento.

Apenas com essas 4 funções ‘echo’, ‘var_dump’, ‘exit’, ‘die’, conseguimos entender o erro em qualquer aplicação PHP.

Como utilizar o Xdebug para depuração avançada no PHP?

Embora o var_dump() seja uma ferramenta poderosa para depurações rápidas, ele tem suas limitações, especialmente em projetos maiores e mais complexos. O Xdebug é uma extensão do PHP que oferece funcionalidades avançadas, como:

  • rastreamento de pilha;
  • profiling;
  • capacidade de interromper a execução do código em pontos específicos para inspecionar variáveis.

Seguindo nosso exemplo, caso precisemos ver os dados da variável $cachorro como ele é instanciado e depois utilizar o var_dump para ver os dados do cachorro após setar um nome, eu faço dessa maneira no código:

PHP

$cachorro = new Cachorro();

var_dump($cachorro);

$cachorro->setNome(‘Scooby’);

var_dump($cachorro);exit;

O retorno deste código, sem ter o Xdebug habilitado, será este:

PHP

object(Cachorro)#1 (2) { [“raca”:”Cachorro”:private]=> string(6) “Poodle” [“nome”:”Cachorro”:private]=> string(3) “Bob” } object(Cachorro)#1 (2) { [“raca”:”Cachorro”:private]=> string(6) “Poodle” [“nome”:”Cachorro”:private]=> string(6) “Scooby” }

Ou seja, sem quebras de linha entre os objetos ou entre as propriedades do objeto, deixando mais difícil de ler este retorno.

Como habilitar o Xdebug?

Agora, vamos habilitar o Xdebug. Para isso, é preciso baixar a extensão para o PHP instalado em sua máquina ou acessar o site oficial do Xdebug para encontrar as instruções de instalação de acordo com seu Sistema Operacional.

Como utilizar Xdebug em Linux?

Em Linux, basta instalar pelo terminal da sua máquina:

ShellScript

sudo apt-get install php-xdebug

Como utilizar Xdebug no Windows?

Em Windows, é preciso baixar a dll, colocar na pasta de extensões e adicioná-lo pelo php.ini:

Conteúdo php.ini

zend_extension=”c:\caminho\para\sua\pasta\de\extensoes\xdebug.dll”

xdebug.remote_enable=1

xdebug.remote_port=9000

Como utilizar Xdebug em MacOSx?

Em MacOSx:

pecl

pecl install xdebug

O que fazer após a instalação do Xdebug?

Agora, com Xdebug instalado, acesse novamente sua página e veja a saída do var_dump formatada com quebras de linha e cores para melhor visualização:

PHP (xdebug_var_dump.png)

/caminho/para/seu/script/index.php:37:

object(Cachorro)[1]

  private ‘raca’ => string ‘Poodle’ (length=6)

  private ‘nome’ => string ‘Bob’ (length=3)

/caminho/para/seu/script/index.php:39:

object(Cachorro)[1]

  private ‘raca’ => string ‘Poodle’ (length=6)

  private ‘nome’ => string ‘Scooby’ (length=6)

Por último, também podemos utilizar a própria IDE para nos ajudar a debugar a aplicação, assim como as IDE’s de linguagens compiladas. Vamos tomar o PHPStorm como exemplo, mas, primeiramente, devemos garantir que ele esteja conseguindo se comunicar com o Xdebug. Para isso, vá em:

  • File;
  • Settings;
  • Languages & Frameworks;
  • PHP;
  • Debug.

A IDE costuma vir configurada corretamente, mas, para testar, clique em “Validate debugger configuration on the Web Server”. Em “Path to create validation script”, coloque o caminho para ser gerado o script e em “Url to validation script”, a url para acessá-lo:

validate php storm

validate script

Após garantir que a IDE consegue conversar com o Xdebug, baixe a extensão para o seu navegador conversar com a IDE e prossiga com a validação. No PHPStorm, marque até qual linha desejas fazer a depuração clicando no número da linha:

linha marcada

No seu navegador, ative a extensão e acesse o seu script de teste, o que fará com que você seja imediatamente redirecionado para o seu PHPStorm e veja o passo a passo do que está sendo feito:

passo a passo

Esse comentários em cinza são gerados pela própria IDE se comunicando com o Xdebug, e com isso, conseguimos entender que na função setNome está sendo recebido o valor “Scooby“, mas, a propriedade nome continua como “Bob“.

Leia também: PHP 8 — Novidades E Impactos No Desenvolvimento Web

Como vimos até aqui, existem muitas abordagens para depurar uma aplicação em PHP, combinando o var_dump() com Xdebug, com uma IDE, ou apenas utilizando-o no script. De qualquer forma, fazer a depuração em PHP é simples e ágil.

Quer obter resultados ainda melhores com seu site? Conheça os planos de hospedagem da KingHost e garanta um ambiente seguro e otimizado para suas aplicações web.

O que você achou deste conteúdo?

O que você achou deste conteúdo?

Redação KingHost
Redação KingHost
Somos uma empresa de soluções digitais, especialistas em simplificar o uso da tecnologia e referência em hospedagem de site.
Redação KingHost
Redação KingHost
Somos uma empresa de soluções digitais, especialistas em simplificar o uso da tecnologia e referência em hospedagem de site.

Compartilhe esse conteúdo com alguém que possa gostar também

Receba todo mês conteúdos
incríveis como esses para
seguir evoluindo

Mensagens para você