PHP - Métodos de depuração (debugger)

Julho 2017



A linguagem PHP é tão bem equipada em recursos de depuração, que ficará difícil encontrar uma desculpa para não tentar corrigir seus erros você mesmo!

Todos estes métodos se referem à exibição de informações sobre as variáveis ou sobre o contexto em um script. Eles também se referem aos maus hábitos que devemos adotar, com detalhes...

Informações sobre uma variável

Echo


A primeira função, a mais básica para exibir o valor de uma variável é, obviamente, o "Echo". Ele pode exibir um número inteiro, uma cadeia de caracteres (string) ou um número real.
É um hábito a ser adquirido: uma pesquisa SQL não funciona? Então, armazene-a em uma variável e depois a exiba com um "Echo", antes de executá-la. Assim, você poderá descobrir se o problema vem de uma variável que tem um valor incoerente ou um valor nulo.

Você também poderá testar a sua consulta de forma mais direta, copiando e colando a que foi exibida, em sua página web.

Por exemplo, se você utiliza o MySQL, você poderá testar sua pesquisa com o phpMyAdmin ou com o cliente MySQL oficial (passando por um console Linux ou uma janela DOS no Windows).

print_r()


A função Echo é conveniente, mas inadequada em alguns casos. Ela não pode exibir uma tabela nem as características de um objeto. Para isso, o " print_r " é mais avançado. Esta função exibe o valor integral, uma string ou um valor real e apresenta de modo estruturado, uma tabela ou um objeto.

var_dump() / var_export()


Mais verbal ainda que o anterior: a função var_dump() te dá o tipo de uma variável ou os campos de uma tabela, etc ... assim como o seu conteúdo exato e, quanto às strings, o número de caracteres. Se a variável contiver um valor "vazio ou falso", como 0, ''(string vazia), Null ou false, você verá o tipo e o valor exato.
Var_export() é parecida mas apresenta estas informações como código PHP.

Redirecionar a saída (não exibir na tela)


O que chamamos aqui de "saída" são os dados que, normalmente, aparecem na tela.
Pode ser que você precise armazenar dados relatados pelo var_dump ou print_r em um arquivo em vez da tela ou em uma página web.

Suponhemos que você queira armazenar essas informações em um arquivo chamado test.log
Você precisará manter os dados de saída na memória usando a função ob_start(), depois, no final do seu script, colocar esta saída em uma variável com a ob_get_contents() e, excluir esses dados para a tela com a ob_end_clean().

Agora, é só gravar estes dados no arquivo.

Veja o que dá:

Eu tenho uma tabela chamada $tab, eu quero armazenar a sua descrição no arquivo test.log ao invés da tela:
<?  
ob_start();  
$tab=array(1=>'teste',  
 2=>'teste2');  
var_export($tab);  

$tab_debug=ob_get_contents();  
ob_end_clean();  

$fichier=fopen('test.log','w');  
fwrite($arquivo,$tab_debug);  
fclose($arquivo);  
?>

Agora, os detalhes daa tabela $tab foram salvos no arquivo e nada foi exibido na tela ou na página web.

"Backtrace" ou relatório de contexto


Um backtrace, ou relatório de contexto (se alguém encontrar uma tradução, por favor...) te ajudará a traçar o caminho através das chamadas de funções e inclusões de arquivos para chegar a um determinado ponto no código.

Vejamos um exemplo inspirado no site do PHP:
fr.php.net/manual/pt_BR/function.debug-print-backtrace.php
Temos uma primeira página (functions.php)
<?php   

function b()  
{  
 var_dump(debug_backtrace());  
}  
function a()  
{  
 b();  
}  

a();  

?>

Depois, um segundo arquivo que se chamará functions.php (nós chamaremos main.php):
<?php  
include 'functions.php';  
?>

Veja o que obtemos:
array(3) {  
  [0]=>  
  array(4) {  
    ["file"]=>  
    string(29) "/functions.php""  
    ["line"]=>  

    int(10)  
    ["function"]=>  
    string(1) "b"  
    ["args"]=>  
    array(0) {  
    }  
  }  
  [1]=>  
  array(4) {  
    ["file"]=>  
    string(29) "/functions.php""  
    ["line"]=>  
    int(13)  
    ["function"]=>  
    string(1) "a"  
    ["args"]=>  
    array(0) {  
    }  
  }  
  [2]=>  
  array(4) {  
    ["file"]=>  
    string(30) "/main.php"  
    ["line"]=>  
    int(3)  
    ["args"]=>  
    array(1) {  
      [0]=>  
      string(29) "/functions.php"  
    }  
    ["function"]=>  
    string(7) "include"  
  }  
}


Temos três tabelas, a análise é feita a partir da última para chegar à primeira se quisermos rastrear o caminho do código desde o início.

Em cada quadro, temos:

function: a função que é chamada
args: Os argumentos passados para essa função (no caso, o caminho para functions.php)
line: a linha em questão no código
file: o caminho para o arquivo PHP em processamento.

Nesta longa sequência, para chegar ao ponto de rastreio (debug_backtrace()), podemos observar que passamos pela função "include" no arquivo principal (main.php) e depois por a() e, finalmente, b () no arquivo functions.php.

Isto pode ser útil para ver como se comporta o código seguindo a ordem de chamadas das função e o valor dos parâmetros que são passados como argumentos.


A função debug_backtrace() retorna uma tabela com o relatório de contexto à partir do lugar onde você fez a chamada.

Eu postei diretamente com a var_dump () mas você pode usá-la como quiser, armazená-la em uma variável, etc.

A função debug_print_backtrace (PHP 5) te ajudará a exibir o relatório diretamente.

Utilizar os relatórios de erro corretamente


PHP descreve bem os erros nas páginas web (ou na tela, se você usar o PHP para uma aplicação que não se destina à web).

Você pode vê-los detalhadamente.

Pode ser que você tenha destaivado este relatório de erro, usando o operador @
Utilisez-le avec parcimonie, il est utile car il peut par exemple vous permettre de ne pas donner de renseignements sur votre base de données dans un rapport d'erreur, mais il faut tout de même penser à gérer cette erreur qui ne s'affichera pas.

Use com moderação, ele é útil, pois pode, por exemplo, te ajudar a não dar informações sobre o seu banco de dados em um relatório de erro, mas você deverá, assim mesmo, pensar em administrar este erro que não será exibido.

Da mesma forma, assinalar à PHP para que ela te relate todos os erros do PHP (configuração padrão normalmente) através da função error_reporting, te ajudará a entender melhor:
error_reporting(E_ALL);

A palavra-chave global


Existe em PHP uma palavra-chave chamada "global."

Ela permite que você use uma variável de escopo global dentro de uma função.

Fuja desta palavra-chave Não a utilize, a menos que sua vida esteja em jogo...

Esta característica torna o código ilegível e sua depuração difícil de seguir.

O debbuger APD


O PHP também tem funções avançadas de depuração agrupadas chamas APD.

Complementos




Tradução feita por Lucia Maurity y Nouira

Veja também

Artigo original publicado por . Tradução feita por pintuda. Última modificação: 17 de junho de 2011 às 11:49 por pintuda.
Este documento, intitulado 'PHP - Métodos de depuração (debugger)', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.