1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| <?php
/*
----------------------------------------------
| CE FICHIER EST LIVRE PAR LE FRAMEWORK. |
| IL NE DOIT PAS ETRE MODIFIE |
| POUR LES BESOINS DE L'APPLICATION. |
----------------------------------------------
*/
/*
$Id: Debug.class.php,v 1.3 2007/01/30 14:27:34 sekaijin Exp $
*/
/**
@package debug
@class Debug
@brief Affichage formatté de n'importe quel objet ou variable.
L'appel de la méthode Debug::show() provoque un affichage. Etant donné
qu'après tout affichage il n'est plus possible d'envoyer des entêtes
Http et que cela est fortement préjudiciable au fonctionnement général
du framework (largement basé sur les sessions), show offre au besoin
un lien pour poursuivre l'action ainsi interrompue.
@section usage Mise en oeuvre par l'exemple
<code>Debug::show("Nom de l'objet : ", $obj);</code>
Affichage de la variable $obj précédé d'un laïus explicatif plus
ou moins verbeux à votre sauce. Il est possible d'utiliser le paramètre
de commentaire pour afficher la valeur d'une autre variable de type
simple (int, string).
La constante DAPCFG_DEBUG_SHOW, si elle est définie dans le fichier
de config et positionnée à false, permet de bloquer ces affichages
(souhaitable en production). L'affichage est donc activé par défaut.
@remark Les méthodes obsolètes ont été retirées depuis la version 1.2.1.
@author Jean Yves Terrien
@author Patrick Dubois
*/
class Debug {
/**
Fournit la version de cette classe.
*/
function getVersion() {
return "1.4";
}
/**
Affichage structuré d'une variable, quel que soit son type.
Cet affichage embarque sa propre feuille de style mais qu'une seule
fois pour l'ensemble des appels successifs à cette méthode.
Tous les styles sont gérés dans un DIV.Debug, aussi assurez-vous de
ne pas utiliser une classe de style nommée '.Debug' sur un 'DIV' de
vos propres affichages.
Notification de l'affichage au reste de l'application par une
constante DEBUG_STARTED valorisée à true, car cet affichage va
bloquer les envois de header et donc le mécanisme de session.
Les méthodes qui gèrent ces mécanismes pourront en tenir compte.
@param message (string) message à afficher avant la valeur
@param value (any) variable (ou expression) à évaluer
*/
function show($message, $value=NULL) {
static $_styled = false;
if (defined("DAPCFG_DEBUG_SHOW") and !DAPCFG_DEBUG_SHOW) return false;
if (!defined('DEBUG_HTML')) define('DEBUG_HTML',true); //affiche pas les débug HML (false en commentaire)
@define('DEBUG_STARTED', true);
$trace = debug_backtrace();
$fichier = basename($trace[0]["file"]);
$ligne = $trace[0]["line"];
$txt = '<div class="file">Dans ' . $fichier . ":" . $ligne . "</div>";
$print_trace = create_function('$trace',
'unset($trace[0]); //concerne myErrorHandler sans importance
if (count($trace) > 0) {
if (!DEBUG_HTML) echo "\n";
echo "<ul class=\"caller\">";
foreach ($trace as $entry) {
if (!DEBUG_HTML) echo "\n";
echo "<li class=\"caller\">Appel de : <b>";
if (isset($entry["class"])) {
echo $entry["class"] . "::" . $entry["function"];
} else {
echo $entry["function"];
}
echo "()</b>";
if (isset($entry["file"])) {
echo "<br>dans <i>";
echo $entry["file"];
echo ":" . $entry["line"];
echo "</i>";
}
echo "</li>";
}
if (!DEBUG_HTML) echo "\n";
echo "</ul>";
if (!DEBUG_HTML) echo "\n";
}');
if (!$_styled&&DEBUG_HTML) {
// on n'écrit une section style qu'une seule fois sur le flux courant
// quel que soit le nombre d'appels à cette méthode.
echo "\n<!-- STYLES pour DEBUG -->\n";
echo "<style>\n";
echo " div.Debug {text-align:left; }\n";
echo " div.Debug pre {padding:3px; color:#333333; background-color:#DDDDDD; font-family: mono; font-size: 9pt; line-height:10pt;}\n";
echo " div.Debug .file {color:#666666; font-style:italic; padding-bottom:5px;}\n";
echo " div.Debug .message {color:#006600;}\n";
echo " div.Debug .stabilo {background-color:yellow; padding-left:3px; padding-right:3px;}\n";
echo " div.Debug .caller {color:#003399; list-style:square; margin:8px; line-height:9pt;}\n";
echo "</style>\n";
echo "<!-- fin STYLES pour DEBUG -->\n";
$_styled = true;
}
echo "\n\n<!-- DEBUG";
if (DEBUG_HTML) echo " -->";
echo "\n";
echo '<div class="Debug"><pre>';
if (is_array($value) || is_object($value)) {
echo $txt . '<span class="message">' . $message . '</span>' . " => ";
print_r($value);
$print_trace($trace);
} elseif (@is_bool($value)){
echo $txt . '<span class="message">' . $message . '</span>' . " => " . ucfirst(gettype($value)) . "\n";
if ($value) {
$value = "True";
} else{
$value = "False";
}
echo "{\n [] => " . $value . "\n}";
$print_trace($trace);
} elseif (@is_null($value)){
echo $txt . '<span class="stabilo">' . $message . '</span>';
$print_trace($trace);
} elseif (@is_string($value) && @is_file($value)) {
echo $txt . '<span class="message">' . $message . '</span>' . " => File\n";
echo "{\n [] => " . $value . "\n}";
} else {
echo $txt . '<span class="message">' . $message . '</span>' . " => " . ucfirst(gettype($value)) . "\n";
echo "{\n [] => " . $value . "\n}";
$print_trace($trace);
}
global $DAP;
if (defined('DAPCFG_PERFORMANCE_SHOW') && DAPCFG_PERFORMANCE_SHOW) {
print '<p style="color:#333333; font-family:monospace; font-size:8pt;"';
print ' title="Pour supprimer cet affichage de performance, passez la clé de configuration DAPCFG_PERFORMANCE_SHOW à false.">';
print 'Traitement:' . sprintf("%0.3f", @$DAP->chrono->read()) . 's';
print '</p>';
}
echo "</pre>\n</div>\n";
if (DEBUG_HTML) echo "<!-- ";
echo "fin DEBUG -->\n";
echo "\n";
} // fin function show
} // fin class Debug |
Partager