Astuce pour visualiser ses variables PHP sans debugeur

Posons le contexte:
Je code avec komodo Edit qui ne possède pas de debugger PHP (version gratuite).
Visualisation avec firefox du contenu des variables, dans la console de firebug.

La problématique:
Comment visualiser le contenu des variables PHP en runtime.

Combien de fois ais-je perdu des heures à chercher le pourquoi d’un bug à cause de variables php non visibles.
Combien de fois ai-je collé des echo par ci et par là dans mes codes pour tenter de voir le contenu de mes variables php.

1
echo "<!-- ".$mavar."-->";

Obligeant d’aller ensuite visualiser le code source de la page html dans le navigateur.

Je ne rencontrais pas ce souci avec javascript. L’excellent outil Firebug permettant de visualiser directement les variables et leur contenu en runtime (quitte à ajouter un point d’arrêt ou utiliser le mode pas à pas), et même de logguer des messages en console avec console.log().
Du coup il m’en venu l’idée de passer des informations de PHP à la console de firebug !
Au départ une simple insertion de script php qui rédigeait un script js de console.log, j’ai soumis cette idée à Cahnory sur le chat qui s’est empressé d’en faire une petite classe que j’ai a mon tour lègèrement modifiée.
Je vous en soumet le premier jet:

class FfxConsoleDebug
  {
    private $dumps = array();
    
    static private function getEmptyDump($type = 'log', $back = 1) {
      $d    = debug_backtrace();
      return array(
        'type'  => $type,
        'file'  => $d[$back]['file'],
        'line'  => $d[$back]['line']
      );
    }
    
    public function dump($var) {
      $vars = func_get_args();
      $dump = self::getEmptyDump();
      $dump['vars'] = array();
      foreach($vars as $key => $value) {
        if(is_object($value) && !is_a($value, 'stdClass')) {
          $value = array(
            'class' => get_class($value),
            'id'    => spl_object_hash($value),
            'attr'  => get_object_vars($value)
          );
        }
        $dump['vars'][]   = $value;
      }
      $this->dumps[] = $dump;
    }
    
    public function warn($warning) {
      $dump = self::getEmptyDump('warn');
      $dump['msg'] = $warning;
      $this->dumps[]   = $dump;
    }
    
    public function alert($alert) {
      $dump = self::getEmptyDump('alert');
      $dump['msg'] = $alert;
      $this->dumps[]   = $dump;
    }
    
    public function toJs($json=true) {
      $js = '';
      foreach($this->dumps as $dump) {
        
        switch($dump['type']){
          case 'log' :  $msg=($json)?"',".json_encode((object)$dump['vars']):(preg_replace('~\r?\n~',"\\r\\n",addslashes(var_export($dump['vars'],true))))."'";
                        //$js .='console.info(\'PHP debug line ==============='.$msg.',\''.addslashes($dump['file']).':'.$dump['line'].'\');';
                        $js .='console.info(\'================= PHP debug info ==============='."\\nFile :\t".addslashes($dump['file'])."\\nLine :\t".$dump['line']."\\n".$msg.',\''.':'.'\');';
                        
                        break;
          case 'warn' : $js .= 'console.warn(\'PHP:'.stripslashes($dump['msg'])."\\nFile :\t".addslashes($dump['file'])."\\nLine :\t".$dump['line']."\\n".'\');';
                          break;
          case 'alert': $js .= 'alert(\'PHP ALERT : \n'.stripslashes($dump['msg']).'\');';
                          break;              
                        
        }              
      }
      
      return $js;
    }
    
    public function toHeader() {
      $hash = spl_object_hash($this);
      foreach($this->dumps as $k => $dump) {
        $id = $hash.'-'.$k;
        if($dump['type'] === 'log') {
          header('PHPrint-'.$id.'-source: ' . $dump['file'].' on line '.$dump['line']);
          foreach($dump['vars'] as $i => $v) {
            header('PHPrint-'.$id.'-'.$i.'-value: '. json_encode($v));
          }
        } else {
          header('PHPrint-'.$id.'-warning: ' . $dump['msg']);
        }
      }
    }
  }
  $debug = new FfxConsoleDebug;
  
  
  //USAGE
  /*
  $d->dump('test','ok');
  $d->dump(array('test'));
  $d->dump($d);
  $d->warn('Ne pas oublier de supprimer les dumps');
   echo '' . $d->toJs( [true/false]) . '';  */

J’ai mis cette classe dans un fichier que j’inclus dans tous mes projets au moyen d’un require()

1
require('debuglib.php');

Il suffit de placer les lignes souhaitées dans le code php à l’endroit ou l’on souhaite visualiser ses variables
Lors de l’affichage dans le navigateur, les lignes de debug apparaissent dans la console firebug avec le numéro de ligne et le nom du fichier.

le paramètre boolean true / false permet:
en mode true (par defaut) d’obtenir un objet dans la console
en mode false d’obtenir un string mis en forme comme un var_export de php

Personnellement cette petit classe m’a fait gagner un temps précieux en me permettant d’avoir un aperçu direct des ce qui se passe au niveau de mes variables php.

3 réflexions au sujet de « Astuce pour visualiser ses variables PHP sans debugeur »

    • Je connais firebug qui en effet permet de discuter avec le console firebug.
      Mais cette classe me permet un affichage personnalisé qui me convient mieux (nom de fichier, nr de ligne et affichage entant qu’objet ou que string dump).

      Pour ce qui est d’installer un debug il serait possible de le faire aussi sous komodo edi, mais les tutos que j’ai trouvés ne sont pas super clairs … :(

Laisser un commentaire