Programmation événementielle en php ...

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 645 fois - Téléchargée 20 fois

Contenu du snippet

Salut,
Bon bah voilà, je me demandais comment faire pour faire de la programmation événementielle en PHP, c'est-à-dire la possibilité de définir des actions à effectuer lors d'un changement interessant dans l'état d'un objet. L'exemple que j'ai choisi pour illustrer la méthode que j'ai mis en place est très simple (et aussi très nul, mais je regardais Les Experts sur la 1, et du coup, ça m'a donné l'idée ...) : on a 2 classes : une classe voiture dont les instances ont la possibilité d'être démarrées et arrêtées, et on peut également incrémenter leur vitesse ; une classe policier dont les instances peuvent verbaliser. Dans notre exemple, si la vitesse est superieure à 50, alors le policier est averti : il explique alors la raison du procés verbal et arrête la voiture.

Source / Exemple :


<?php
/* -------------------- */
   class Delegate
   {
      private $Owner = null;
      private $MethodName = null;
      
      function __construct($owner, $method_name)
      {
         $this -> Owner = $owner;
         $this -> MethodName = $method_name;
      }
      
      function invoke($sender, $event)
      {
         $owner = $this -> Owner;
         $method_name = $this -> MethodName;
         $owner -> $method_name($sender, $event);
      }
   }
/* -------------------- */
   class Event
   {
      public $Description;
      
      function __construct($description)
      {
         $this -> Description = $description;
      }  
   }
/* -------------------- */
   class Car
   {
      public $Name = '';
      private $Started = false;
      
      public  $OverSpeed = array();
      private $Speed = 0;
      
      public function __call($method_name, $arguments)
      {
         if(substr($method_name, 0, 2) == 'on')
         {
            $event_name = substr($method_name, 2, strlen($method_name) - 2);
            if(property_exists($this, $event_name))
            {
               $listeners = $this -> $event_name;
               foreach($listeners as $listener)
               {
                  $listener -> invoke($arguments[0], $arguments[1]);
               }
            }   
         }
      }
      
      public function __construct($name)
      {
         $this -> Name = $name;
      }
      
      public function accelerate()
      {
         if($this -> Started)
         {
            $speed = &$this -> Speed;
            $speed += 10;
            if($speed > 50) $this -> onOverSpeed($this, new Event("Excès de vitesse"));
         }
         else echo 'Démarre la voiture avant d\'accélerer ! <br />';
      }
      
      public function start()
      {
         $this -> Started = true;
      }
      
      public function stop()
      {
         $this -> Started = false;
      }
   }
/* -------------------- */
   class PoliceOfficier
   {
      private $Matricule = null;
      
      function __construct($matricule)
      {
         $this -> Matricule = $matricule;
      }
      
      public function charge($sender, $event)
      {
         echo 'Ici l\'agent '.($this -> Matricule).'. Je dresse un procés verbal contre le conducteur de la '.($sender -> Name).' pour cause de '.strtolower($event -> Description).'. <br />';
         $sender -> stop();
         echo 'J\'ai arrêté l\'automobiliste ! Il est aussi complêtement bourré ! <br />';
      }
   }
/* -------------------- */
   $john = new PoliceOfficier('3845-5214');
   $porche = new Car('Porche');
   $porche -> OverSpeed[] = new Delegate($john, 'charge');
   $porche -> start();
   $porche -> accelerate();
   $porche -> accelerate();
   $porche -> accelerate();
   $porche -> accelerate();
   $porche -> accelerate();
   $porche -> accelerate();
   $porche -> accelerate();
/* -------------------- */
?>

Conclusion :


On a 2 autres classes qui sont mises en place : la classe Delegate qui permet d'appeller une methode particulière d'un objet particulier (le tout étant passé en paramètre lors de la construction) ; la classe Event, qui contient seulement une description de l'évenement. Il faudrait modifier cette classe pour la rendre plus interessante (date et heure de l'évenement, j'en sais rien moi ! ...).
L'idée du code est donc de créer une propriété dans la classe observé qui contient la liste de tous les délégués vers la méthode voulu des observeurs (listeners). Lorsque l'on veut déclancher l'évenement, il suffit d'appeller la méthode onNomDeLEvenement (que l'on détecte via la méthode magique __call() ...).
Je sais pas si c'est la meilleure manière et j'attends beaucoup de réactions et de critiques (et de conseils) dans vos commentaires.
++ !
LocalStone

A voir également

Ajouter un commentaire Commentaires
Messages postés
13
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
13 juillet 2008

Non car ces évènements sont des interactions avec le client (le navigateur). D'ailleurs, on ne parle pas ici d'évènements tout fait, mais de la création d'évènements.
Il n'est pas possible d'intercepter un évènement client via le code PHP uniquement.
Messages postés
3
Date d'inscription
lundi 4 février 2008
Statut
Membre
Dernière intervention
13 juillet 2008

bon jour,
as que il y a comme : onclick(),onchange(),onmosumove()...............ect.
Messages postés
13
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
13 juillet 2008

Pour ceux qui disent qu'on peut pas parler vraiment d'evenementiel, je leu dis que l'evenementiel ne s'arrête pas a l'interaction client/serveur ou utilisateur/programme, mais c'est bien la réaction du programme à un évenement (ici la voiture dépasse la limite).

Donc OUI, programmation evenementielle avec PHP ^^

et Merci pour ce bout de code sympa !
Messages postés
8
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
5 décembre 2007

Ton code est vraiment sympa.
Cela ressemble beaucoup au design pattern d'état. L'idée est vraiment à creuser.
coooooool
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016

Au fait c'est de la pub pour porsche.:)
En plus t'as oublié le contôle d'identité ,et si le conducteur s'appelle sarko, il faut le relacher.:-)
Afficher les 21 commentaires

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.