Gestion Bus -> voyageurs

Eléphant du PHP | 369 Messages

22 sept. 2009, 17:24

Salut les gens,

Suite au post de Megadeth (post306906.html#p306906)
et ayant été un peu trop loin dans la démo je poste ici mon 'tit travail lol

Si ca plait dites le... Si ca plait pas... ;)

S'entend, livré ainsi je doute que ca puisse servir à tous mais adapté je pense que oui.

Oups, j'oubliais: Les commentaires sont quelques fois étranges mais je code avec Edit.com, le charset
est différent. Merci d'être indulgent à ce propos lol
<?php

   /**
    * Nom  : IdClass
    *
    * Dependance : none
    */
    abstract class idClass
    {
      /**
       * Tableau des id mode static & prot‚g‚
       *
       * @var array
       */
       protected static $_arrayId = Array();

      /**
       * Permet de savoir si l'id donn‚ en argument existe d‚ja
       *
       * @value  : string
       * @return : bool
       */
       protected function isIdExiste($strId)
       {
          return isset(self::$_arrayId[$strId]) ? true : false;
       }
    }

   /**
    * Nom : Personne
    *
    * Dependence : Class parente
    */
    class Personne extends idClass
    {
      /**
       * Id de la personne concern‚, mode priv‚
       *
       * @var array
       */
       private $_id = "";

      /**
       * Commentaire pour cette personne
       *
       * @var string
       */
       private $_comment = "";

      /**
       * Constructeur
       *
       * Assigne l'id par l'argument
       *
       * @value  : string
       * @return : none
       */
       public function __construct($strId)
       {
         /**
          * Si l'argument est invalide on sort
          */
          if (!is_string($strId)) die("Argument attendu de type chaine !");

         /**
          * Si l'id existe deja alors on sort
          */
          if ($this -> isIdExiste($strId)) die("ID deja reference !");

         /**
          * On enregistre
          */
          $this -> _id = $strId;
       }

      /**
       * Assigne un commentaire … la variable
       *
       * Si $bfErase est … vrai alors le message suppl‚mentaire
       * sera s‚par‚ du pr‚c‚dent par un retour chariot.
       *
       * @value  : string, commentaire … copier
       * @value  : [bool] flag d'‚criture
       * @return : bool
       */
       public function setComment($string, $bfErase = false)
       {
         /**
          * Test les l'arguments
          */
          if (!is_string($string)) die("Argument attendu de type chaine !");
          if (!is_bool($bfErase))  die("Argument attendu de type boolean !");

          if ($bfErase) $this -> _comment = $string;
          else $this -> _comment .= ($this -> _comment == "") ? $string : "\n".$string;

          return true;
       }

      /**
       * Renvoie la variable ID de l'objet
       *
       * @value  : none
       * @return : string
       */
       public function getId()
       {
          return $this -> _id;
       }
    }

   /**
    * Nom : Bus
    *
    * Dependence : none
    */
    class Bus
    {
      /**
       * Numero du bus si besoin
       *
       * @var integer
       */
       protected $_iNumero = "0";

      /**
       * Tableau des personnes dans le bus
       *
       * @var integer
       */
       protected $_voyager = Array();

      /**
       * Nombre de places maximum, par d‚faut 23
       *
       * @var integer
       */
       protected $_iCountMax = 23;

      /**
       * Constructeur
       *
       * D‚truit certaine des variables de class
       *
       * @value  : none
       * @return : bool
       */
       protected function __construct()
       {
          unset($this -> _iNumero);
          unset($this -> _voyager);
       }

      /**
       * Rend le clonage impossible
       *
       * @value  : none
       * @return : none
       */
       private function __clone()
       {
       }

      /**
       * Permet d'assigner un numero au bus
       *
       * Un meme numero peut etre present...
       *
       * @value  : integer
       * @return : bool
       */
       function setNumero($iNumero)
       {
          if (!is_numeric($iNumero)) die("L'argument attendu est de type integer !");

          $this -> _iNumero = $iNumero;
       }

      /**
       * Trouve dans le tableau des voyageurs un espace vide
       * entre deux clef d'index et la retourne.
       *
       * Peut, si le bus est complˆt, renvoyer false
       *
       * @value  : none
       * @return : integer
       */
       function getFreeSpace()
       {
         /**
          * Variable temporaire du nombre de voyageur inscrits
          *
          * @var integer
          */
          $iCount = count($this -> _voyager);
             
         /**
          * Si le bus est bond‚ alors on sort
          */
          if ($iCount >= $this -> _iCountMax) die("Depassement de capacite du bus !");

         /**
          * Flag de v‚rification
          *
          * @var boolean
          */
          $bfWork = true;

         /**
          * Variable temporaire de compteur de place 
          *
          * @var integer
          */
          $iCounter = 0;

         /**
          * Boucle sur le tableau afin de r‚cup‚rer un clef disponible
          *
          * @var integer
          */
          while($bfWork)
          {
            /**
             * Si l'index n'existe pas alors on l'enregistre et
             * on marque le flag comme faux
             */
             if (!isset($this -> _voyager[$iCounter])) $bfWork = false;
             else $iCounter++;
          }
             
         /**
          * Renvoie l'index disponible
          */
          return $iCounter;
       }

      /**
       * Ajoute un voyageur dans le bus
       *
       * Si le bus est complˆt alors il retourne false
       *
       * @value  : objet Personne
       * @return : bool
       */
       public function addUsager(Personne $objPersonne)
       {
          $mixed = $this -> getFreeSpace();
          if ($mixed === false) return false;

         /**
          * Variable temporaire de l'id
          *
          * @var string
          */
          $strId = $objPersonne -> getId();

         /**
          * Variable temporaire de l'id
          *
          * @var string
          */
          $bfFound = false;

         /**
          * Si le tableau existe on poursuit sinon on saute le test
          */
          if (is_array($this -> _voyager))
          {
            /**
             * Boucle sur les ‚l‚ments du tableau
             */
             foreach($this -> _voyager AS $objValue)
             {
               /**
                * Si concordence on marque le flag et on sort de la boucle
                */
                if ($strId == $objValue -> getId())
                {     
                   $bfFound = true;
                   break;
                }
             }
          }

         /**
          * Si le fag est vrai alors on sort
          */
          if ($bfFound) die("Voyageur deja present !");

         /**
          * Assignation de l'objet
          */
          $this -> _voyager[$mixed] = $objPersonne;

         /**
          * R‚ussite de l'insertion
          */
          return true;
       }

      /**
       * Renvoie l'instance du voyageur not‚ par son id
       *
       * @value  : string
       * @return : instance ou false si l'id n'est pas r‚f‚renc‚
       */
       public function getInstance($strId)
       {
         /**
          * Si l'argument est invalide alors on sort
          */
          if (!is_string($strId)) die("L'argument attendu est de type chaine !");

         /**
          * Variable temporaire pour l'instance a trouver
          *
          * @var, instance
          */
          $inst = NULL;

         /**
          * Si le tableau n'existe, pas d'instance donc on renvoie faux
          */
          if (!is_array($this -> _voyager)) return false;

         /**
          * Boucle sur les ‚l‚ments du tableau
          */
          foreach($this -> _voyager AS $objValue)
          {
            /**
             * Si concordence on marque le flag et on sort de la boucle
             */
             if ($strId == $objValue -> getId())
             {     
                $bfFound = true;
                $inst = $objValue;
                break;
             }
          }

         /**
          * Si le fag est vrai alors on sort
          */
          if ($bfFound) return $inst;

         /**
          * Echec de la fonction, faux renvoy‚
          */
          return true;
       }

      /**
       * Supprime un voyageur du bus
       *
       * Si r‚ussite de la fonction renvoie vrai sinon faux
       *
       * @value  : mixed, ID ou objet Personne
       * @return : bool
       */
       public function delUsager($mixed)
       {
         /**
          * Si l'argument est invalide alors on sort
          */
          if (!$mixed instanceof Personne && !is_string($mixed)) die("Argument invalide !");

         /**
          * Variable temporaire de l'id
          *
          * @var string
          */
          $strId = "";

         /**
          * Attribution de la chaine ID pour recherche
          */
          if (is_string($mixed)) $strId = $mixed;
          else $strId = $objPersonne -> getId();

         /**
          * Variable temporaire de l'id
          *
          * @var string
          */
          $bfFound = false;

         /**
          * Si le tableau n'existe on sort en revoyant false
          */
          if (!is_array($this -> _voyager)) die("Aucun voyageur present, suppression impossible !");

         /**
          * Boucle sur les ‚l‚ments du tableau
          */
          foreach($this -> _voyager AS $key => $objValue)
          {
            /**
             * Si concordence, alors :
             *
             * on marque le drapeau de recherche
             * on d‚truit la clef correspondante
             * on sort de la boucle
             */
             if ($strId == $objValue -> getId())
             {     
                $bfFound = true;
                unset($this -> _voyager[$key]);
                break;
             }
          }

         /**
          * R‚ussite de la fonction on renvoit vrai
          */
          if ($bfFound) return true;

         /**
          * Echec de la fonction, on sort
          */
          if (!$bfFound) die("Le Voyageur n'etait pas reference dans le bus !");
       }
    }

   /**
    * Nom : Transport
    *
    * Dependence : Class parente
    */
    class Transport extends Bus
    {
      /**
       * Tableau des diff‚rents bus
       *
       * @var Instance, priv‚e, static
       */
       private static $_instance = NULL;

      /**
       * Tableau des diff‚rents bus
       *
       * @var Array, prot‚g‚
       */
       private $_arrayBus = array();

      /**
       * Constructeur
       *
       * Son status de prot‚g‚ permet le pattern singleton
       *
       * Force l'envoi ver le parent
       */
       protected function __construct()
       {
         /**
          * Force le constructeur parent
          */
          parent::__construct();

         /**
          * D‚truit la variable de class parent
          */
          unset($this -> _iCountMax);
       }

      /**
       * Initialise l'objet si celui-ci n'existe pas encore
       *
       * L'appel se fait de maniŠre static
       * Renvoie une instance soit de l'objet global soit d'un bus
       * voir l'argument.
       *
       * value  : [string], destination du bus
       * return : instance du bus
       */
       public static function init($strDest = false)
       {  
         /**
          * Si la class n'est pas instanci‚e on le fait
          */
          if (!isset(self::$_instance)) self::$_instance = new self();
          $inst = self::$_instance;

         /**
          * Si aucune autre demande on sort
          */
          if ($strDest === false) return true;

         /**
          * Si l'argument est invalide alors on sort
          */
          if (!is_string($strDest)) die("L'argument attendu est de type chaine !");

         /**
          * Si la destination existe d‚ja on sort
          */
          if (isset($inst -> _arrayBus[$strDest])) die("Destination deja reference !");

         /**
          * On assigne l'objet au tableau
          */
          $inst -> _arrayBus[$strDest] = new parent();

         /**
          * L'instance du bus est retourn‚e
          */
          return $inst -> _arrayBus[$strDest];
       }

      /**
       * Retourne l'instance du bus correspondant a l'argument
       *
       * Si aucune r‚f‚rence a ce nom alors false est retourn‚
       *
       * @value  : string, id du bus
       * @return : instance concern‚e
       */
       public static function getBus($strId)
       {
         /**
          * Si l'argument est invalide alors on sort
          */
          if (!is_string($strId)) die("L'argument attendu est de type chaine !");

         /**
          * Variable temporaire pour l'instance de class
          *
          * @var, instance
          */
          $inst = self::$_instance;

         /**
          * Si aucune r‚f‚rence … ce nom alors on sort
          */
          if (!isset($inst -> _arrayBus[$strId])) return false;

         /**
          * Au contraire renvoie son instance
          */
          return $inst -> _arrayBus[$strId];
       }

    }
?>
L'usage en est le suivant:
<?php
$global = Transport::init();
$paris  = Transport::init("Paris");
$orleans = Transport::init("Orleans");
$paris -> addUsager(new Personne("A-123"));
$orleans -> addUsager(new Personne("Z-123"));
$paris -> addUsager(new Personne("A-325"));
$paris -> addUsager(new Personne("A-117"));
$pers = new Personne("TOTO");
$paris -> addUsager($pers);
$pers -> setComment("Prefere la fenetre");
$obj = $paris -> getInstance("A-325");
$obj -> setComment("Gros fumeur"); 

print_r(Transport::getBus("Paris"));
print_r(Transport::getBus("Orleans"));
?>
Libre à vous de l'utiliser, la modifer etc... Soyez juste cool en me le disant.

@+ bon code all

EDIT: Après re-lecture je suis embété lol Le script est carrément indigeste.
Donc, désolé pour le tas, j'ai pas trop fais gaffe au moment du cop/col et bravo pour les plus courageux ;)

Petit nouveau ! | 6 Messages

27 sept. 2009, 22:22

Merci pour ta source ;) Sa va sans doute me servir !