☁️ Hospedagem Cloud e VPS - Alta performance para seus projetos com desconto imperdível 💰

Kinghost | Blog

Como fazer Debug com var_dump() e Xdebug no PHP

Publicado em 22/06/2018

Atualizado em 12/04/2024
var_dump

PHP pode ser a linguagem que mais sofre bullying nas redes por ter diversas aplicações meio “bagunçadas”. Porém, pessoalmente, acho a linguagem mais fácil de depurar por ser interpretada, não compilada e ter o var_dump() disponível.

Apenas com esta função, consegui resolver vários situações. Isso me ajudou bastante a entender diversos códigos, já que me incentivava a entrar em funções e entendê-las para saber qual variável analisar.

O que é debug?

Depurar, ou “debugar”, mais utilizado pelos desenvolvedores, é o procedimento de monitorar partes específicas do código para encontrar a raiz de certo erro.

Existem diversas ferramentas para auxiliar a fazer o debug de aplicações como o Whoops (uma biblioteca PHP para ajudar a ler exceções não previstas), mas aqui aprenderemos um jeito simples e prático de fazer debug em qualquer aplicação.

Lembrando que é muito importante que ative o display_errors no seu php.ini e deixe como padrão “mostrar todos os erros”. Caso não tenha essas configurações, 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 acessar o Painel de Controle -> Selecionar o seu Domínio -> Configuração PHP, ativar display_errors.

Quanto ao reporte de erros, coloque no arquivo global de sua aplicação o seguinte código:

error_reporting(E_ALL);

Bom como exemplo, vamos utilizar o pequeno trecho de código abaixo.

Exemplo de debug:

<?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();

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.

Mas se acessarmos 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”;

Eu coloquei o nome Scooby com a função setNome, certo? 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 faz. É uma função básica que retorna uma string e, dentro dela, imprime os valores da raça e do nome deste objeto que está instanciado.

Debug utilizando var_dump() na prática

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"

Bom, se o nome está sendo impresso corretamente e não está sendo alterado antes de retornar a nossa string, então temos que analisar onde está sendo setado este nome. 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 assim que o erro está no momento em que atribuímos este valor à propriedade nome do objeto:

public function setNome($nome)
    {
   	 $this->nome == $nome;
    }

Então 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.

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 ir 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.
E 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 acessar 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.

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.

banner-promo-vps

Debug com Xdebug

Também, caso queira ver melhor formatado os dados do var_dump, pode ser habilitada a extensão “xdebug” do php.

Por exemplo, caso eu queria ver os dados da variável $cachorro como ele é instanciado e depois quero 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.

Agora, vamos habilitar o xdebug.

Para isso, deves baixar a extensão para o PHP instalado em sua máquina.

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

ShellScript
sudo apt-get install php-xdebug

Em Windows, deves 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

Em MacOSx:

pecl
pecl install xdebug

ou acesse o site oficial do xdebug para encontrar as instruções de instalação de acordo com seu Sistema Opercional.

Agora com xdebug instalado, acesse novamente sua página que verás a saída do var_dump formatada:

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)

Com quebras de linha e cores para melhor visualização.

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.

Como exemplo, utilizaremos aqui o PHPStorm.

Primeiramente, devemos garantir que o PHPStorm está conseguindo se comunicar com o xdebug.

Vá em File > Settings > Languages & Frameworks > PHP > Debug

Normalmente a IDE já vem configurada corretamente, mas para testar, clique em “Validate debugger configuration on the Web Server” para ser executado um script para checar a instalação do seu XDebug.

Em Path to create validation script” coloque o caminho para ser gerado o script e “Url to validation script” a url para acessar o mesmo:

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.

Agora podemos fazer 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“.

Então, vimos que com PHP temos diversas abordagens para depurar uma aplicação, combinar o var_dump com xdebug, com uma IDE, ou apenas utilizar o var_dump no script.
De todas as maneiras, fazer a depuração em PHP é simples e ágil.

E se você busca conhecimento gratuito, uma excelente opção é o Conexão KingHost: uma plataforma repleta de conteúdos relevantes. São diversas aulas em formato de vídeo com foco em empreendedorismo, gestão, marketing digital, design e presença digital. Confira!

Não perca a oportunidade, são conteúdos gratuitos que irão ajudar o seu negócio a evoluir no digital! Clique no banner abaixo e saiba mais!

E aí, curtiu o material? Caso tenha surgido alguma dúvida, escreva pra gente ali nos comentários. Quer saber mais sobre linguagens de programação? Confira os conteúdos do nosso Blog da KingHost.

O que você achou deste conteúdo?

O que você achou deste conteúdo?

Guilherme

Guilherme Mallmann

Desenvolvedor focado em entregar sempre o melhor produto possível, utilizando métodos ágeis e a engenharia de software tendo como foco o produto final.

Guilherme

Guilherme Mallmann

Desenvolvedor focado em entregar sempre o melhor produto possível, utilizando métodos ágeis e a engenharia de software tendo como foco o produto final.

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

Conteúdos relacionados

Criar um e-mail de cobrança é uma estratégia necessária quando se lida com inadimplência. Nesses momentos, a empresa deve ter cuidado para evitar cobranças indelicadas, que possam constranger o consumidor. Ao mesmo tempo, precisa convencer a pessoa a resolver logo o impasse. Por isso, é uma tarefa delicada. Neste artigo, vamos explicar como redigir um...
A assinatura de email pode ser uma das primeiras impressões que você transmite para outra pessoa, pois ela também é parte importante de uma mensagem online. Algo tão simples, mas que merece atenção, pois existem muitos detalhes que envolvem a criação de uma boa assinatura de email. Por isso, neste artigo, você vai entender um...
Você certamente já passou pela frustração de abrir um site que demora uma eternidade para carregar. Então, sabe como isso é irritante, não é mesmo? Se preferir ouvir o conteúdo, é só clicar no play! Com isso, sabe que a velocidade do site desempenha um papel fundamental na experiência dos usuários e no sucesso do...
Se você é um Microempreendedor Individual (MEI), sabe que gerenciar sua empresa pode ser desafiador. Uma vez que, além de cuidar das finanças, lidar com clientes e fornecedores, você também tem a responsabilidade de cumprir com suas obrigações fiscais.  Uma dessas obrigações é fazer a declaração anual de faturamento, que é fundamental para manter sua...

📅 Aulão GRATUITO 🚀 Como VENDER MAIS na internet 💰

Mensagens para você