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:
- acessar o Painel de Controle;
- selecionar o seu Domínio;
- configuração PHP;
- 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:
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:
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:
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?