Vous pouvez me suivre sur : twitter linkedin rss feed google buzz

Class PHP : Assert

Classe PHP toute prête pour gérer les assertions
03- 07- 2009

Aujourd'hui, je vais vous proposer une petite classe utile.
Elle ne révolutionne rien et n'a rien de bien compliquer, je ne m'étendrais donc pas sur les explications.


Objectif


La classe Assert permet de mettre en place le principe des assertions du C++.
Une assertion est un prédicat vérifiant une expression ou des critères devant toujours être rempli au moment où on déclenche la vérification, si le prédicat se revèle faux il faut alors arrêter l'exécution du programme.

Régulièrement dans mon code, j'effectue plusieurs contrôles et si la vérification échoue je lève une exception :

  • contrôle du type des variables passées en paramètre des fonctions
  • code retour d'un appel de méthode
  • présence d'un élément dans un tableau

J'en avais un peu marre de toujours recopier ces contrôles surtout avec le lancement de l'exception, j'ai donc voulu mutualiser ce traitement en reprenant le concpets des Assert() du C++.


La classe Assert


< ?php

class Assert
{
  // assertion : @expression is true
  public function assertTrue( $expression )
  {
    if( !$expression ) throw new Exception( 'Error : Variable not defined.');
    return true;
  }

  // assertion : @expression is false
  public function assertFalse( $expression )
  {
    if( $expression ) throw new Exception( 'Error : Variable not defined.');
    return true;
  }  
  
  // assertion : @variable is defined
  public function assert( $variable )
  {
    if( !isset( $variable ) ) throw new Exception( 'Error : Variable not defined.');
    return true;
  }
    
  // assertion : @variable is defined and is of type @type
  public function assertType( $variable, $type )
  {
    assert( $variable );
    switch( $type )
    {
      case 'int' :
                if( !is_numeric( $variable ) ) throw new Exception( 'Error : Variable Type Expected [numeric]');
                break;
      case 'string' :
                if( !is_string( $variable ) ) throw new Exception( 'Error : Variable Type Expected [string]');
                break;   
      case 'array' :
                if( !is_array( $variable ) ) throw new Exception( 'Error : Variable Type Expected [array]');
                break;
      case 'object' :
                if( !is_object( $variable ) ) throw new Exception( 'Error : Variable Type Expected [object]');
                break;                
    }
    return true;
  }
  
  // assertion : @variable is defined and is not of type @type
  public function assertNotType( $variable, $type )
  {
    assert( $variable );
    switch( $type )
    {
      case 'int' :
                if( is_numeric( $variable ) ) throw new Exception( 'Error : Variable Type Not Expected [numeric]');
                break;
      case 'string' :
                if( is_string( $variable ) ) throw new Exception( 'Error : Variable Type Not Expected [string]');
                break;   
      case 'array' :
                if( is_array( $variable ) ) throw new Exception( 'Error : Variable Type Not Expected [array]');
                break;
      case 'object' :
                if( is_object( $variable ) ) throw new Exception( 'Error : Variable Type Not Expected [object]');
                break;                
    }
    return true;
  }
  
  // assertion : @variable is defined and is null
  public function assertNull( $variable )
  {
    assert( $variable );
    if( !is_null( $variable ) ) throw new Exception( 'Error : Null Value Expected');
    return true;
  } 
  
  // assertion : @variable is defined and is not null
  public function assertNotNull( $variable )
  {
    assert( $variable );
    if( is_null( $variable ) ) throw new Exception( 'Error : Null Value Expected');
    return true;
  }

  // assertion : @variable is defined and is of class @name
  public function assertClass( $variable, $name )
  {
    assert( $variable );
    if( !is_a( $variable, $name ) ) throw new Exception( 'Error : Class Expected ['.$name.']');
    return true;
  }

  // assertion : @variable is defined and is not of class @name
  public function assertNotClass( $variable, $name )
  {
    assert( $variable );
    if( is_a( $variable, $name ) ) throw new Exception( 'Error : Class Not Expected ['.$name.']');
    return true;
  }
  
  // assertion : @array is defined and contains @value
  public function assertInArray( $array, $value )
  {
    assert( $variable );
    if( !in_array( $value, $array ) ) throw new Exception( 'Error : Value ['.$value.'] Expected In Array['.print_r( $array, true ).']');
    return true;
  }  
  
  // assertion : @array is defined and does not contain @value
  public function assertNotInArray( $array, $value,)
  {
    assert( $variable );
    if( in_array( $value, $array ) ) throw new Exception( 'Error : Value ['.$value.'] Expected Not In Array['.print_r( $array, true ).']');
    return true;
  }
}

?>

Les assertions présentent dans cette classe ne sont que des exemples et vous pouvez l'enrichir de tous les contrôles qui vous semblent nécessaires.
Par contre, je vous conseille de toujours définir les assertions par paire opposée.

Vous avez aimé cet article ? Alors partagez le :
  • Email
  • Twitter
  • Facebook
  • delicious
  • Digg it
  • LinkedIn
  • Technorati
  • StumbleUpon
  • Reddit
  • NewsVine
  • Google
  • YahooMyWeb
Ajouter un commentaire