Php5 - classe de logging de classes.


Contenu du snippet

Cette classe sert à logguer les différentes méthodes et autres fonctions que vous pouvez appeler dans un script.
En l'état pur, la classe ne sert pas à grand chose, mais elle est tellement simple qu'elle peut se faire hériter très facilement pour quelque chose de plus spécialiser (normal, c'est son but !).

Voici donc la classe basique et une classe dérivée qui peut logguer les actions d'appels de méthodes d'une classe SQL.

Source / Exemple :


<?php
class Logger {
 
 protected $objet = NULL;
 public $Log = array(
         'method' => NULL,
         'args'   => NULL);
 
 public function __construct($objet) {
  $this->objet = $objet;
 }
 
 public function __call($name, $args) {
  
  $this->LogTo($name, $args);
  return call_user_func_array( array(&$this->objet, $name), $args);
  
 }
 
 protected final function LogTo($name, $args) {
  $this->Log['method'] = $name;
  $this->Log['args'] = $args;
 }
 
 public final function getLog() {
  return $this->Log;
 } 
 
 public final function Clear() {
  $this->Log = array('method' => NULL, 'args' => NULL);
 }
 
 public function __get($var) {
  return $this->objet->$var;
 }
   
 public function __set($var, $val) {
  $this->$objet->$var = $val;
 }
 
}

class SQLLog extends Logger {
 
 private $array = array(
         'SELECT' => 0,
		 'UPDATE' => 0,
		 'INSERT' => 0,
		 'DELETE' => 0);
		 
 public $nb_query = 0;
 public $time_query = 0;
 
 public function __call($name, $args) {
 
  if ( strtolower($name) === 'query' ) {
       if ( isset($args) && !empty($args) ) {
            $typeofQuery = trim(substr($args[0], 0, 6));
	   } else {
	        $typeofQuery = trim(substr($this->objet->sql, 0, 6));
	   }
	   
	   $this->array[$typeofQuery]++;
	   
	   $query_start = microtime(true);
       $output = call_user_func_array( array(&$this->objet, $name), $args);
	   $this->time_query = microtime(true) - $query_start;
	   
	   $this->nb_query++;
	   
  }	else {
       $output = call_user_func_array( array(&$this->objet, $name), $args);
  }
  
  $this->LogTo($name, $args);
  return $output;
  
 }
 
}
?>

Conclusion :


Alors comment ca tourne ?
Si avant, vous appeliez votre classe SQL comme suit :
$db = new mysql;
Il suffit pour cela de faire :
$db = new SQLlog( new mysql );

Et vous utilisez votre objet comme avant :
$db->query().
$db->fetch_row().

La classe de log est totalement transparente grâce à __call()... donc sans soucis pour l'utilisation :)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.