'; } } /** * Affiche ou retourne une variable formatée pour le débogage. * * @param mixed $var Variable à afficher. * @param string $label Étiquette pour identifier la variable (par défaut 'Dump'). * @param bool $echo Indique si la sortie doit être affichée (TRUE) ou retournée (FALSE). * @return string|null Contenu formaté si $echo est FALSE, sinon NULL. */ public static function dump($var, $label = 'Dump', $echo = true) { // Start output buffering ob_start(); echo "
";
        echo "" . $label . ": ";

        // Convert array or object to string
        if (is_array($var)) {
            print_r($var);
        } elseif (is_object($var)) {
            echo self::objectToString($var);
        } else {
            var_dump($var);
        }

        echo "
"; // Get the contents of the buffer $output = ob_get_clean(); // If echo is true, print the output if ($echo) { echo $output; } else { return $output; } } /** * Convertit un objet en chaîne formatée pour le débogage. * * @param object $object Objet à convertir. * @param string|null $_tab Indentation pour le formatage (optionnel). * @return string Représentation formatée de l'objet. */ public static function objectToString($object, $_tab = NULL) { ob_start(); $tab = "    " . $_tab; echo "Object (" . get_class($object) . ")\n"; echo $_tab . "{\n"; foreach (get_object_vars($object) as $property => $value) { echo $tab . "[$property] => "; if (is_array($value)) { echo self::arrayToString($value, $tab); } elseif (is_object($value)) { echo self::objectToString($value, $tab); } else { echo "" . var_export($value, true) . "\n"; } } echo $_tab . "}\n"; return ob_get_clean(); } /** * Convertit un tableau en chaîne formatée pour le débogage. * * @param array $array Tableau à convertir. * @param string|null $_tab Indentation pour le formatage (optionnel). * @return string Représentation formatée du tableau. */ public static function arrayToString($array, $_tab = NULL) { ob_start(); $tab = "    ".$_tab; echo "Array\n"; echo $_tab . "(\n"; foreach ($array as $key => $value) { echo $tab . "[$key] => "; if (is_array($value)) { echo self::arrayToString($value, $tab); } elseif (is_object($value)) { echo self::objectToString($value, $tab); } else { echo "" . var_export($value, true) . "\n"; } } echo $_tab . ")\n"; return ob_get_clean(); } /** * Convertit une variable en chaîne de caractères pour le débogage. * * @param mixed $var La variable à convertir. * @param string $label Une étiquette pour identifier la variable. * @return string La représentation formatée de la variable. */ private static function variableToString($var, $label) { ob_start(); echo "$label: "; if (is_array($var) || is_object($var)) { print_r($var); } else { var_dump($var); } return ob_get_clean(); } /** * Récupère la trace d'exécution sous forme de chaîne. * * @return string La trace d'exécution formatée. */ public static function getTraces(){ $return = "Trace : "; // Obtenir la trace d'exécution $backtrace = debug_backtrace(); $nb = count($backtrace)-1; for ($i=$nb; $i > 0; $i--) { $return .= ($i != 0) ? "[".$backtrace[$i]["function"]."] " : NULL; $return .= str_replace(DOCUMENT_ROOT, '', $backtrace[$i]["file"]).":".$backtrace[$i]["line"]; $return .= ($i != 1) ? " >> " : NULL; } return $return; } /** * Affiche un tableau formaté pour le débogage. * * @param array|null $_array Le tableau à afficher (optionnel). * @param int|null $_exit Si défini, termine le script après l'affichage (optionnel). */ public static function print_r(?array $_array = NULL, ?int $_exit = NULL) { echo "
".debug::getTraces() . "
"; if(empty($_array)){ echo "
EMPTY
"; } else { echo "
";
            print_r($_array);
            echo "
"; } ($_exit != NULL) ? exit() : NULL; } /** * Vérifie si une chaîne contient du HTML. * * @param string $_string La chaîne à vérifier. * @return bool TRUE si la chaîne contient du HTML, FALSE sinon. */ public static function isHtml(string $_string) : bool { $stripped_string = strip_tags($_string); return $_string !== $stripped_string; } /** * Génère un contenu HTML encapsulé dans un iframe. * * @param string $htmlContent Le contenu HTML à encapsuler. * @return string Le contenu HTML complet avec iframe. */ public static function generateHtmlContent($htmlContent) { $id = md5(microtime()); return << Exécution de HTML HTML; } /** * Ajoute un message au journal de débogage. * * @param mixed $_message Le message à ajouter. * @param string|null $_mark Une marque pour identifier le message (optionnel). */ public static function log($_message, $_mark = NULL) { $mark = "
"; $mark .= ($_mark != NULL) ? "
". $_mark . "
" : NULL; $mark .= self::getTraces(); $mark .= "
"; if($_message != NULL) { if(is_array($_message)){ self::$logs[] = ["data" => $mark ."
" . self::arrayToString($_message) . "
", "nl2br" => TRUE]; } elseif(is_object($_message)){ self::$logs[] = ["data" => $mark ."
" . self::objectToString($_message) . "
", "nl2br" => TRUE]; } elseif(self::isHtml($_message)){ self::$logs[] = ["data" => $mark ."
" . self::generateHtmlContent($_message) . "
", "nl2br" => FALSE]; } elseif($mark != NULL){ self::$logs[] = ["data" => $mark ."
" . $_message . "
", "nl2br" => TRUE]; } else { self::$logs[] = ["data" => $_message, "nl2br" => TRUE]; } } } /** * Ajoute un message au journal de session de débogage. * * @param mixed $_message Le message à ajouter. * @param string|null $_mark Une marque pour identifier le message (optionnel). */ public static function logSession($_message, $_mark = NULL) { $mark = "
"; $mark .= ($_mark != NULL) ? "
". $_mark . "
" : NULL; $mark .= self::getTraces(); $mark .= "
"; if($_message != NULL) { if(is_array($_message)){ self::setSession(["data" => $mark ."
" . self::arrayToString($_message) . "
", "nl2br" => TRUE]); } elseif(is_object($_message)){ self::setSession(["data" => $mark ."
" . self::objectToString($_message) . "
", "nl2br" => TRUE]); } elseif(self::isHtml($_message)){ self::setSession(["data" => $mark ."
" . self::generateHtmlContent($_message) . "
", "nl2br" => false]); } elseif($mark != NULL){ self::setSession(["data" => $mark ."
" . $_message . "
", "nl2br" => TRUE]); } else { self::setSession(["data" => $_message, "nl2br" => TRUE]); } } } /** * Affiche les journaux de débogage. */ public static function renderLogs() { echo "
"; echo "
"; echo "PHP ". phpversion() . " | MYSQL " . db::version() . " | " . number_format(self::$closeTime, 4) . " secondes "; echo "
"; echo "
"; foreach (self::$logs as $log) { if($log != NULL){ echo "
"; echo $log["nl2br"] == TRUE ? nl2br($log["data"]) : $log["data"]; echo "
"; } } if(self::ifSession()){ foreach (self::getSession() as $logSession) { echo "
"; echo $logSession["nl2br"] == TRUE ? nl2br($logSession["data"]) : $logSession["data"]; echo "
"; } } echo "
"; get::javascript("debug"); } /** * Initialise le débogueur en enregistrant une fonction de fermeture. */ public static function init() { // Register shutdown function to render logs at the end of the script execution register_shutdown_function(function () { self::renderLogs(); }); } /** * Démarre un chronomètre pour mesurer le temps d'exécution. */ public static function startTimer() { self::$startTime = microtime(true); } /** * Arrête le chronomètre et calcule le temps écoulé. */ public static function endTimer() { self::$closeTime = microtime(true) - self::$startTime; } /** * Génère un badge HTML avec un lien et un libellé. * * @param string $_link Lien vers lequel le badge redirige. * @param string $_label Libellé affiché sur le badge. * @return string Le code HTML du badge. */ public static function getBadge(string $_link,string $_label){ return ''. $_label .''; } /** * Affiche l'environnement actuel si ce n'est pas l'environnement de production. */ public static function printEnvironnement(){ echo (ENVIRONNEMENT != "PROD") ? " [" . ENVIRONNEMENT . "]" : NULL; } /** * Construit un badge HTML personnalisé à partir des données fournies. * * @param array $_data Données pour personnaliser le badge (couleur, texte, lien, etc.). * @return string Le code HTML du badge. */ private static function buildBadge(array $_data){ $color = empty($_data["color"]) ? "black" : $_data["color"]; $backgroundColor = empty($_data["background-color"]) ? "orangered" : $_data["background-color"]; $class = empty($_data["class"]) ? NULL : $_data["class"]; $link = empty($_data["link"]) ? "#" : $_data["link"]; $txt = empty($_data["txt"]) ? NULL : $_data["txt"]; $icon = empty($_data["icon"]) ? NULL : " "; return "" . $icon . $txt . ""; } /** * Récupère tous les badges de débogage disponibles. * * @return string Les badges HTML générés. */ public static function getBadges(){ $return = ""; if(debug::isFile("maintenance")){ $return .= self::buildBadge([ "icon" => "bi bi-exclamation-diamond-fill", "link" => "/parametres.html#parametres-debug", "background-color" => "red", "color" => "white", "txt" => "MODE MAINTENANCE" ]); } if(debug::isFile("debug")){ $return .= self::buildBadge([ "icon" => "bi bi-bug-fill", "class" => "toggle-logs", "link" => "#", "background-color" => "orangered", "color" => "white", "txt" => "MODE DEBUG" ]); } if(self::isFile("sql")){ $return .= self::buildBadge([ "icon" => "bi bi-database-fill", "class" => "toggle-logs", "link" => "#", "background-color" => "orange", "color" => "black", "txt" => "DEBUG SQL" ]); } if(self::isFile("email")){ $return .= self::buildBadge([ "icon" => "bi bi-envelope-fill", "class" => "toggle-logs", "link" => "#", "background-color" => "orange", "color" => "black", "txt" => "DEBUG EMAIL" ]); } if(self::isFile("send-email")){ $return .= self::buildBadge([ "icon" => "bi bi-envelope-fill", "class" => "toggle-logs", "link" => "#", "background-color" => "orange", "color" => "black", "txt" => "DEBUG SEND EMAIL" ]); } if(self::isFile("submit")){ $return .= self::buildBadge([ "icon" => "bi bi-send-fill", "class" => "toggle-logs", "link" => "#", "background-color" => "orange", "color" => "black", "txt" => "DEBUG SUBMIT" ]); } return $return; } /** * Ajoute des données au tableau de session de débogage. * * @param mixed $_data Les données à ajouter à la session. */ public static function setSession($_data){ $_SESSION["DEBUG"][] = $_data; } /** * Récupère les données de la session de débogage et les réinitialise. * * @return array Les données de la session de débogage. */ public static function getSession(){ $return = $_SESSION["DEBUG"]; self::resetSession(); return $return; } /** * Vérifie si des données de débogage sont présentes dans la session. * * @return bool TRUE si des données sont présentes, FALSE sinon. */ public static function ifSession(){ return empty($_SESSION["DEBUG"]) ? FALSE : TRUE; } /** * Réinitialise les données de la session de débogage. */ public static function resetSession(){ unset($_SESSION["DEBUG"]); } }