begin process at 2012 05 27 21:45:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > HASHMAP EN PHP AVEC LA SPL

HASHMAP EN PHP AVEC LA SPL


 Information sur la source

Note :
Aucune note
Catégorie :Class et Objet ( POO ) Classé sous :POO, objet, spl, iterator, recursive Niveau :Initié Date de création :09/12/2008 Date de mise à jour :04/01/2009 04:29:05 Vu / téléchargé :3 576 / 60

Auteur : dorian91

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Bonjour,

[ATTENTION code en PHP 5.3] (methode get_called_class non supporté dans les versions précédentes)
J'ai voulu recréer le system de HashMap Java (enfin tres vite fais, et je me rappel plus si c'est le hashmap ou le vecteur c'est bien loin mes cours de JAVA ^^), le but principal était de me familliariser avec la spl.
Cette source utilise les interfaces ArrayAccess, IteratorAggregate, Countable
Elle utilise les classes ArrayIterator, LimiteIterator de la spl

Source

  • <?php
  • namespace System::Iterator
  • /**
  • * @abstract
  • * @name HashMapIterator
  • * @author Dorian
  • * @since 09/12/2008
  • * @version 1.0.0
  • */
  • abstract class MapIterator implements Iterator, Countable, ArrayAccess
  • {
  • /**
  • * Tableau MAP
  • *
  • * @access protected
  • * @var array
  • */
  • protected $_aMap;
  • /**
  • * Nombre d'élément du tableau
  • *
  • * @access private
  • * @var integer
  • */
  • private $_iCount;
  • /**
  • * Index de l'itérateur
  • *
  • * @access private
  • * @var integer
  • */
  • private $_iIndex;
  • /**
  • * Défini si on peut modifier les éléments du tableau
  • *
  • * @access private
  • * @var boolean
  • */
  • private $_bWritable;
  • /**
  • * Constructeur de la classe
  • * Initialise le tableau et le compteur
  • *
  • * @access public
  • * @param array $aMap
  • * @param boolean $bWritable
  • * @return void
  • */
  • public function __construct(array $aMap = array(), $bWritable = true)
  • {
  • $this->_iIndex = 0;
  • $this->_aMap = array();
  • $this->_bWritable = $bWritable;
  • if( count($aMap) > 0 )
  • {
  • $this->add($aMap);
  • }
  • $this->_iCount = count($this->_aMap);
  • }
  • /**
  • * Retourne le nombre d'élément du tableau
  • *
  • * @access public
  • * @return integer
  • */
  • public function count()
  • {
  • return $this->_iCount;
  • }
  • /**
  • * Retourne l'élément suivant
  • *
  • * @access public
  • * @return mixed
  • */
  • public function current()
  • {
  • return current($this->_aMap);
  • }
  • /**
  • * Retourne la clé de l'élément courant
  • *
  • * @access public
  • * @return mixed
  • */
  • public function key()
  • {
  • return key($this->_aMap);
  • }
  • /**
  • * Passe le pointeur sur l'élément suivant
  • *
  • * @access public
  • * @return void
  • */
  • public function next()
  • {
  • next($this->_aMap);
  • $this->_iIndex++;
  • }
  • /**
  • * Met le pointeur au début du tableau
  • *
  • * @access public
  • * @return void
  • */
  • public function rewind()
  • {
  • reset($this->_aMap);
  • $this->_iIndex = 0;
  • }
  • /**
  • * Test si l'iterateur est valide
  • *
  • * @access public
  • * @return boolean
  • */
  • public function valid()
  • {
  • return $this->_iIndex < $this->_iCount;
  • }
  • /**
  • * Test l'existance de l'élément dans le tableau
  • *
  • * @access public
  • * @param mixed $mOffset
  • * @return boolean
  • */
  • public function offsetExists($mOffset)
  • {
  • return array_key_exists($mOffset, $this->_aMap);
  • }
  • /**
  • * Retourne un élément du tableau
  • *
  • * @param mixed $mOffset
  • * @return mixed
  • */
  • public function offsetGet($mOffset)
  • {
  • return $this->get($mOffset);
  • }
  • /**
  • * Modifie un élément du tableau
  • *
  • * @access public
  • * @param mixed $mOffset
  • * @param mixed $mValue
  • * @return void
  • */
  • public function offsetSet($mOffset, $mValue)
  • {
  • $this->set($mOffset, $mValue);
  • }
  • /**
  • * Efface un élément du tableau
  • *
  • * @access public
  • * @param mixed $mKey
  • * @return void
  • */
  • public function offsetUnset($mOffset)
  • {
  • return $this->remove($mOffset);
  • }
  • /**
  • * Ajoute un tableau
  • *
  • * @access public
  • * @param array $aMap
  • * @return void
  • */
  • public function add(array $aMap)
  • {
  • $sClass = get_called_class();
  • foreach( $aMap as $mKey => $mValue )
  • {
  • if( is_array($mValue) )
  • {
  • $this->_aMap[$mKey] = new $sClass($mValue);
  • }
  • else
  • {
  • $this->_aMap[$mKey] = $mValue;
  • }
  • }
  • $this->_iCount = count($this->_aMap);
  • }
  • /**
  • * Retourne un élément du tableau
  • *
  • * @access public
  • * @param mixed $mKey
  • * @return mixed
  • */
  • public function get($mKey)
  • {
  • if( array_key_exists($mKey, $this->_aMap) )
  • {
  • return $this->_aMap[$mKey];
  • }
  • return null;
  • }
  • /**
  • * Ajoute un élément au tableau
  • *
  • * @access public
  • * @param mixed $mKey
  • * @param mixed $mValue
  • * @return void
  • */
  • public function set($mKey, $mValue)
  • {
  • if( false === $this->_bWritable )
  • {
  • throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
  • }
  • $sClass = get_called_class();
  • if( is_array($mValue) )
  • {
  • $this->_aMap[$mKey] = new $sClass($mValue);
  • }
  • else
  • {
  • $this->_aMap[$mKey] = $mValue;
  • }
  • $this->_iCount = count($this->_aMap);
  • }
  • /**
  • * Retourne un tableau contenant les clé
  • *
  • * @access public
  • * @return array
  • */
  • public function getKeys()
  • {
  • return array_keys($this->_aMap);
  • }
  • /**
  • * Combine une autre instance de la class
  • *
  • * @access public
  • * @param object $merge
  • * @return object
  • */
  • public function merge($oMerge)
  • {
  • $sClass = get_called_class();
  • $oReflexion = new ReflectionClass($sClass);
  • if(! $oReflexion->isSubclassOf($this) )
  • {
  • throw new Exception('Vous devez passer en paramètre une classe enfant de MapIterator.', E_ERROR);
  • }
  • foreach($oMerge as $mKey => $mItem)
  • {
  • if(array_key_exists($mKey, $this->_aMap))
  • {
  • if($mItem instanceof $sClass && $this->$mKey instanceof $sClass)
  • {
  • $this->$mKey = $this->$mKey->merge($mItem);
  • }
  • else
  • {
  • $this->$mKey = $mItem;
  • }
  • }
  • else
  • {
  • $this->$mKey = $mItem;
  • }
  • }
  • return $this;
  • }
  • /**
  • * Efface un élément du tableau
  • *
  • * @access public
  • * @param mixed $mKey
  • * @return object|boolean
  • */
  • public function remove($mKey)
  • {
  • if( false === $this->_bWritable )
  • {
  • throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
  • }
  • if(array_key_exists($mKey, $this->_aMap))
  • {
  • unset($this->_aMap[$mKey]);
  • $this->_iCount = count($this->_aMap);
  • return $this;
  • }
  • return false;
  • }
  • /**
  • * Clone l'object
  • *
  • * @access public
  • * @return void
  • */
  • public function __clone()
  • {
  • $aArray = array();
  • $sClass = get_called_class();
  • foreach( $this->_aMap as $mKey => $mValue )
  • {
  • if( $mValue instanceof $sClass )
  • {
  • $aArray[$mKey] = clone $mValue;
  • }
  • else
  • {
  • $aArray[$mKey] = $mValue;
  • }
  • }
  • $this->_aMap = $aArray;
  • }
  • /**
  • * Transforme l'object en tableau
  • *
  • * @access public
  • * @return array
  • */
  • public function __toArray()
  • {
  • $aArray = array();
  • foreach( $this->_aMap as $mKey => $mValue )
  • {
  • if( $mValue instanceof MapIterator )
  • {
  • $aArray[$mKey] = $mValue->__toArray();
  • }
  • else
  • {
  • $aArray[$mKey] = $mValue;
  • }
  • }
  • return $aArray;
  • }
  • /**
  • * Test si l'élément existe
  • *
  • * @access public
  • * @param mixed $mKey
  • * @return boolean
  • */
  • public function __isset($mKey)
  • {
  • return isset($this->_aMap[$mKey]);
  • }
  • /**
  • * Efface un élément du tableau
  • *
  • * @access public
  • * @param mixed $mKey
  • * @return object
  • */
  • public function __unset($mKey)
  • {
  • if( false === $this->_bWritable )
  • {
  • throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
  • }
  • return $this->remove($mKey);
  • }
  • /**
  • * Retourne un élément du tableau
  • *
  • * @access public
  • * @param mixed $mKey
  • * @return mixed
  • */
  • abstract public function __get($mKey);
  • /**
  • * Ajoute un élément au tableau
  • *
  • * @access public
  • * @param mixed $mKey
  • * @param mixed $mValue
  • * @return void
  • */
  • abstract public function __set($mKey, $mValue);
  • }
  • ?>
  • <?php
  • namespace System::Collection
  • /**
  • * @name HashMap
  • * @author aberthelot
  • * @copyright Copyright (c) 2008, Alexandre Berthelot
  • * @since 07/12/2008
  • * @package System::Collection
  • * @version 4.0.0 - AXB - 07/12/2008
  • */
  • class HashMap extends MapIterator
  • {
  • /**
  • * Constructeur de la classe
  • * Initialise le HashMap
  • *
  • * @access public
  • * @param array $aMap
  • * @return void
  • */
  • public function __construct(array $aMap = array())
  • {
  • parent::__construct($aMap);
  • }
  • /**
  • * Modifie un élément de la config
  • *
  • * @access public
  • * @param mixed $mKey
  • * @param mixed $mValue
  • * @return object
  • */
  • public function __set($mKey, $mValue)
  • {
  • $this->set($mKey, $mValue);
  • }
  • /**
  • * Retourne un élément de la configuration
  • *
  • * @access public
  • * @param mixed $mKey
  • * @return mixed var
  • */
  • public function __get($mKey)
  • {
  • return $this->get($mKey);
  • }
  • }
  • ?>
<?php
namespace System::Iterator

/**
 * @abstract
 * @name HashMapIterator
 * @author Dorian
 * @since 09/12/2008
 * @version 1.0.0
 */
abstract class MapIterator implements Iterator, Countable, ArrayAccess
{
  /**
   * Tableau MAP
   *
   * @access protected
   * @var array
   */
  protected $_aMap;

  /**
   * Nombre d'élément du tableau
   *
   * @access private
   * @var integer
   */
  private $_iCount;

  /**
   * Index de l'itérateur
   *
   * @access private
   * @var integer
   */
  private $_iIndex;
  
  /**
   * Défini si on peut modifier les éléments du tableau
   *
   * @access private
   * @var boolean
   */
  private $_bWritable;

  /**
   * Constructeur de la classe
   * Initialise le tableau et le compteur
   * 
   * @access public
   * @param array $aMap
   * @param boolean $bWritable
   * @return void
   */
  public function __construct(array $aMap = array(), $bWritable = true)
  {
    $this->_iIndex    = 0;
    $this->_aMap      = array();
    $this->_bWritable = $bWritable;

    if( count($aMap) > 0 )
    {
      $this->add($aMap);
    }

    $this->_iCount = count($this->_aMap);
  }

  /**
   * Retourne le nombre d'élément du tableau
   *
   * @access public
   * @return integer
   */
  public function count()
  {
    return $this->_iCount;
  }

  /**
   * Retourne l'élément suivant
   * 
   * @access public
   * @return mixed
   */
  public function current()
  {
    return current($this->_aMap);
  }

  /**
   * Retourne la clé de l'élément courant
   *
   * @access public
   * @return mixed
   */
  public function key()
  {
    return key($this->_aMap);
  }

  /**
   * Passe le pointeur sur l'élément suivant
   *
   * @access public
   * @return void
   */
  public function next()
  {
    next($this->_aMap);
    $this->_iIndex++;
  }

  /**
   * Met le pointeur au début du tableau
   *
   * @access public
   * @return void
   */
  public function rewind()
  {
    reset($this->_aMap);
    $this->_iIndex = 0;
  }

  /**
   * Test si l'iterateur est valide
   *
   * @access public
   * @return boolean
   */
  public function valid()
  {
    return $this->_iIndex < $this->_iCount;
  }
  
  /**
   * Test l'existance de l'élément dans le tableau
   *
   * @access public
   * @param mixed $mOffset
   * @return boolean
   */
  public function offsetExists($mOffset) 
  { 
    return array_key_exists($mOffset, $this->_aMap); 
  } 
  
  /**
   * Retourne un élément du tableau
   *
   * @param mixed $mOffset
   * @return mixed
   */
  public function offsetGet($mOffset) 
  {
    return $this->get($mOffset); 
  } 
  
  /**
   * Modifie un élément du tableau
   *
   * @access public
   * @param mixed $mOffset
   * @param mixed $mValue
   * @return void
   */
  public function offsetSet($mOffset, $mValue) 
  { 
    $this->set($mOffset, $mValue);
  } 
    
  /**
   * Efface un élément du tableau
   * 
   * @access public
   * @param mixed $mKey
   * @return void
   */
  public function offsetUnset($mOffset) 
  { 
    return $this->remove($mOffset);
  } 
  
  /**
   * Ajoute un tableau
   *
   * @access public
   * @param array $aMap
   * @return void
   */
  public function add(array $aMap)
  {
    $sClass = get_called_class();
    
    foreach( $aMap as $mKey => $mValue ) 
    {
      if( is_array($mValue) )
      {
        $this->_aMap[$mKey] = new $sClass($mValue);
      } 
      else 
      {
        $this->_aMap[$mKey] = $mValue;
      }
    }
    
    $this->_iCount = count($this->_aMap);
  }
  
  /**
   * Retourne un élément du tableau
   *
   * @access public
   * @param mixed $mKey
   * @return mixed
   */
  public function get($mKey)
  {
    if( array_key_exists($mKey, $this->_aMap) )
    {
      return $this->_aMap[$mKey];
    }
    
    return null;
  }
  
  /**
   * Ajoute un élément au tableau
   *
   * @access public
   * @param mixed $mKey
   * @param mixed $mValue
   * @return void
   */
  public function set($mKey, $mValue)
  {
    if( false === $this->_bWritable )
    {
      throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
    }
    
    $sClass = get_called_class();
    
    if( is_array($mValue) )
    {
      $this->_aMap[$mKey] = new $sClass($mValue);
    }
    else 
    {
      $this->_aMap[$mKey] = $mValue;
    }
      
    $this->_iCount = count($this->_aMap);
  }
  
  /**
   * Retourne un tableau contenant les clé
   *
   * @access public
   * @return array
   */
  public function getKeys()
  {
    return array_keys($this->_aMap);
  }
  
  /**
   * Combine une autre instance de la class
   *
   * @access public
   * @param object $merge
   * @return object
   */
  public function merge($oMerge)
  {
    $sClass     = get_called_class();
    $oReflexion = new ReflectionClass($sClass);
    
    if(! $oReflexion->isSubclassOf($this) )
    {
      throw new Exception('Vous devez passer en paramètre une classe enfant de MapIterator.', E_ERROR);
    }
    
    foreach($oMerge as $mKey => $mItem) 
    {
      if(array_key_exists($mKey, $this->_aMap)) 
      {
        if($mItem instanceof $sClass && $this->$mKey instanceof $sClass) 
        {
          $this->$mKey = $this->$mKey->merge($mItem);
        } 
        else 
        {
          $this->$mKey = $mItem;
        }
      } 
      else 
      {
        $this->$mKey = $mItem;
      }
    }

    return $this;
  }
  
  /**
   * Efface un élément du tableau
   * 
   * @access public
   * @param mixed $mKey
   * @return object|boolean
   */
  public function remove($mKey)
  {
    if( false === $this->_bWritable )
    {
      throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
    }
    
    if(array_key_exists($mKey, $this->_aMap)) 
    {
      unset($this->_aMap[$mKey]);
      $this->_iCount = count($this->_aMap);
      
      return $this;
    }
    
    return false;
  }

  /**
   * Clone l'object
   *
   * @access public
   * @return void
   */
  public function __clone()
  {
    $aArray = array();
    $sClass = get_called_class();

    foreach( $this->_aMap as $mKey => $mValue )
    {
      if( $mValue instanceof $sClass )
      {
        $aArray[$mKey] = clone $mValue;
      }
      else
      {
        $aArray[$mKey] = $mValue;
      }
    }
    
    $this->_aMap = $aArray;
  }

  /**
   * Transforme l'object en tableau
   *
   * @access public
   * @return array
   */
  public function __toArray()
  {
    $aArray = array();

    foreach( $this->_aMap as $mKey => $mValue )
    {
      if( $mValue instanceof MapIterator )
      {
        $aArray[$mKey] = $mValue->__toArray();
      }
      else
      {
        $aArray[$mKey] = $mValue;
      }
    }

    return $aArray;
  }

  /**
   * Test si l'élément existe
   *
   * @access public
   * @param mixed $mKey
   * @return boolean
   */
  public function __isset($mKey)
  {
    return isset($this->_aMap[$mKey]);
  }

  /**
   * Efface un élément du tableau
   * 
   * @access public
   * @param mixed $mKey
   * @return object
   */
  public function __unset($mKey)
  {
    if( false === $this->_bWritable )
    {
      throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
    }
    
    return $this->remove($mKey);
  }
  
  /**
   * Retourne un élément du tableau
   *
   * @access public
   * @param mixed $mKey
   * @return mixed
   */
  abstract public function __get($mKey);
  
  /**
   * Ajoute un élément au tableau
   *
   * @access public
   * @param mixed $mKey
   * @param mixed $mValue
   * @return void
   */
  abstract public function __set($mKey, $mValue);
}
?>

<?php
namespace System::Collection

/**
 * @name HashMap
 * @author aberthelot
 * @copyright Copyright (c) 2008, Alexandre Berthelot
 * @since 07/12/2008
 * @package System::Collection
 * @version 4.0.0 - AXB - 07/12/2008
 */
class HashMap extends MapIterator 
{
  /**
   * Constructeur de la classe
   * Initialise le HashMap
   * 
   * @access public
   * @param array $aMap
   * @return void
   */
  public function __construct(array $aMap = array())
  {
    parent::__construct($aMap);
  }
  
  /**
   * Modifie un élément de la config
   *
   * @access public
   * @param mixed $mKey
   * @param mixed $mValue
   * @return object
   */
  public function __set($mKey, $mValue)
  {
    $this->set($mKey, $mValue);
  }

  /**
   * Retourne un élément de la configuration
   *
   * @access public
   * @param mixed $mKey
   * @return mixed var
   */
  public function __get($mKey)
  {
    return $this->get($mKey);
  }
}
?>


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

09 décembre 2008 18:17:48 :
.
09 décembre 2008 18:19:54 :
.
10 décembre 2008 14:56:40 :
Les méthodes de l'iterateur sont maintenant dans la classe abstraite HashMapIterator. Toutes les méthodes pour modifier le HashMap sont dans la classe HashMap
16 décembre 2008 12:34:58 :
Modification de la classe pour gérer la récursivié
16 décembre 2008 12:36:33 :
.
04 janvier 2009 04:24:55 :
.
04 janvier 2009 04:26:02 :
.
04 janvier 2009 04:27:43 :
PHP 5.3
04 janvier 2009 04:29:05 :
Ajout des namespaces

 Sources du même auteur

Source avec Zip [PHP5.3]PACKAGE CONFIG
Source avec Zip ABSTRACTION PDO
Source avec Zip CLASS DE LOG PHP5

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip MY.REMOTE : SERVEUR D'OBJETS PHP5 par inwebo
Source avec Zip GESTION DE FICHIERS AVEC LA SPL par alphanono
Source avec Zip PHP5 MY EXPLORER : AFFICHE L'ARBORESCENCE DE DOSSIERS par ranouf
Source avec Zip Source avec une capture FILTRER, METTRE EN CACHE OU MAPER, OU TRIER UN ITERATEUR par coucou747
RÉCUPÉRATION DES OBJETS STOCKÉS DANS UNE SESSION par jsgorre

Commentaires et avis

Commentaire de coucou747 le 10/12/2008 09:38:08 administrateur CS

salut

en fait, ca, pour un programmeur php, c'est a la fois un vecteur et une hashmap :D

tu devrais peut-etre implementer les fonctions suivantes :
- map (appliquer une fonction a tout les elements)
- filter
- sort
- copy

Commentaire de dorian91 le 10/12/2008 09:48:13

Salut
Je me disais bien que j'avais un peu mélangé les deux :-)
Merci pour les conseils je vais les mettres en place. Je pense que je vais faire une Classe HashMapIterator et une Classe HashMap avec les fonctions de bidouillage du tableau.
Je modifie et je mettrais a jour la source

Commentaire de dorian91 le 10/12/2008 20:28:06

Voila la mise a jour est effectué.
J'attend vos commentaires

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

[SPL] Une variable objet comme clé de l'interface Iterator [ par LocalStone ] Salut à tous, Alors voilà ma question : est-il possible d'utiliser l'interface Iterator (ou tout interface qui permettent le parcours d'un objet avec Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci orienté objet en php [ par am1ra2 ] bonjour,    j'ai des connaissances sur la POO en php mais je ne connais pas comment implimenter la POO dans mes applications. Probleme POO [ par cedriclomb ] Bonjour,Aujourd'hui au programme casse tete chinois ! :DVoila j'ai une classe B qui est une extends de Aun objet $b=new B;et ensuite $b-&gt;loadModule problème sur free [ par nemetos ] Bonjour,j'ai développé un site en local avec easy php 1.8. Il fonctionne très bien. Seulement lorsque je l'ai uploadé sur free il y a un bug. Voici co Panier particulier ! HELP !! [ par christianp88 ] Bonjour,Je voudrais développer un site avec un panier. Jusque là rien de bien particulier pour vous.Maintenant je vais expliquer le fonctionnement de égaliter entre 2 objets [ par nemetos ] Bonjour,je crée un objet. Après l'avoir initialiser, je veux le mettre dans un tableau.Voici ma procédure :$i=0;$a = new objet1;$b = Array(new objet1) probleme d'affectation de variable dans un objet [ par nemetos ] Bonjour,je crée l'objet suivant : class calendrier {     var $date_courante;     var $annee_courante;     var $mois_courant;     var $jour_courant;    formulaire objet [ par jasou62114 ] bonjour à tous, j'ai un soucis, je n'arrive pas à faire une liste déroulante en php objet. J'ai repris un projet qui as déjà été codé à 99% et je l'a Problème à la création d'un objet [ par BooletMan ] Bonjour bonjour ! A partir d'un XML, je récupère sous forme d'objet les informations concernant un fichier (son nom, si ce fichier est requis, s'il f


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales