begin process at 2012 05 27 18:09:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > PROGRAMMATION ÉVÉNEMENTIELLE EN PHP ...

PROGRAMMATION ÉVÉNEMENTIELLE EN PHP ...


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :evenement, event, delegate Niveau :Initié Date de création :14/02/2007 Vu :14 407

Auteur : LocalStone

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

 Description

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

  • <?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();
  • /* -------------------- */
  • ?>
<?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


 Sources du même auteur

Source avec Zip Source avec une capture MOTEUR D'ASPECT POUR PHP
Source avec Zip [PHPHOOK] UN PETIT SYSTÈME DE GESTION DES HOOKS DE SUBVERSIO...
Source avec Zip [PHP5] TASKSCHEDULER, UN PETIT PLANIFICATEUR DE TÂCHE EN PHP...
Source avec Zip [PHP5] NAVIGUER DANS UNE COLLECTION À L'AIDE D'UNE PSEUDO SY...
Source avec Zip Source avec une capture CLASSE D'ÉDITION DES FICHIERS DE CONFIGURATION D'APACHE

 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

Commentaires et avis

Commentaire de Alain Proviste le 15/02/2007 02:57:55 administrateur CS

tu n'as pas à rougir de l'exemple policier-voiture

Commentaire de ejbye7 le 15/02/2007 08:58:34

Rôôô, c'est Bôôô...
Mais ça me rappelle de mauvais souvenirs...
Une remarque: rajoute quelques commentaires.
Merci en tout cas.
@+
EJ

Commentaire de TheSin le 15/02/2007 09:31:16

Je trouve le concept intéressant, c'est du joli travail :-)

Commentaire de LocalStone le 15/02/2007 10:52:11

Bah merci pour vos commentaires ... Et ce 10/10 est sympa aussi :D ! Je suis en cours, mais je vais essayer de commenter le code dès que j'aurais un peu de temps.
L.S.

Commentaire de dominion le 15/02/2007 11:47:11

je sais pas si ça t'intéresse mais, si tu veux faire de l'évènemenciel PHP sur ta page (en client side donc), tu peux aussi jeter un oeil sur AJAX dans google...

Commentaire de Epoc22 le 15/02/2007 13:01:22

Je capte rien à quoi ça sert.

Commentaire de FhX le 15/02/2007 16:25:00

La même chose peut être fait avec les exceptions pour pas grand chose niveau modification :)

try {
$john = new PoliceOfficier('3845-5214');
$porche = new Car('Porche');
$porche -> start();
$porche -> accelerate(10); // faut lui dire de combien tu veux monter ta vitesse au passage :)
// etc...
} catch (VitesseException $v) {
echo 'Tu es allé trop vite. Ta vitesse actuelle a été intercepté par '.$v->OfficerName().' à la vitesse de '.$v->FlashedSpeed().'.';
}

Il suffit d'étendre les exceptions et de faire mumuse avec ca :)
Ca marche presque pareil, à ceci près que tu as des tests en moins.

Mais pas mal :)

Commentaire de LocalStone le 15/02/2007 17:49:08

Oula oula ... Oui, c'est vrai que l'on peut avoir un comportement identique, mais c'est vraiment une énorme faute de méthodologie d'utiliser ta méthode (sauf ton respect bien sûr ^^). Bah oui, les exceptions, c'est totalement différent des évenements. Générer une exception dans un script permet d'éviter certain bugs en l'attrapant et en faisant l'action appropriée pour éventuellement pouvoir l'éviter et faire que le script continu son déroulement normal.
Mais néanmoins, c'est vrai que c'est joli avec les exceptions ...
++ !
L.S.

Commentaire de FhX le 15/02/2007 18:06:27

Je sais que c'est une erreur :)

Mais l'erreur d'origine ne serait elle pas de dire qu'on utilise PHP évenementiellement alors que ca n'est pas vrai ?
L'évenementielle, c'est intéragir avec l'utilisateur. Hors PHP ne peut pas intéragir avec un client.
"L'évenement" que tu envoies, je peux l'envoyer via une exception. On peut appeler ca du throwing.
Ce que tu envoies, tu veux le récupérer... appelons ca du catching.

C'est ce que fait les exceptions. Alors oui, tu vas me dire, exceptions c'est pas fait pour ca :p Mais si je faisais :

class Event extends Exception {
public function __construct(.....);
}

throw new Event('.....'), ..., ... , ...);

et puis :

try {
..
..
} catch (Event $e) {
//
}


C'est pas pareil à ton avis ? ;)
Et tu n'y auras vu que du feu :p

Voila mon point de vue :p

Commentaire de FhX le 15/02/2007 18:20:40

Ceci étant, les Events via exception ne marche pas si on compte faire plusieurs Events de suite :)

Dans ce cas la, il faut bien se faire une classe d'Event qu'on doit instancier à chaque fois :s

Commentaire de webdeb le 15/02/2007 21:15:18

Sympa comme exemple ^^

Par contre c'est Porsche et non Porche lol

Commentaire de LocalStone le 15/02/2007 22:29:41

Oups ... Désolé ...

Commentaire de dominion le 16/02/2007 00:09:13

LocalStone << AJAX, je le redis, pour les interactions client-serveur en PHP. Néanmoins c'est vrai que du coup, l'évènementiel se retrouve plus au niveau du JavaScript...

Commentaire de kankrelune le 16/02/2007 12:23:36

@ Dominion... ajax n'a rien à voir dans ce cas... ici il sagit d'évènementiel interne à php et non pas d'interaction client/serveur... d'ailleurs étant interne à php peut on réellement parler d'évènementielle... quoi qu'il en soit bonne idée... .. . ;o)

@ tchaOo°

Commentaire de FhX le 16/02/2007 16:32:17

De toute facon, il te faut une classe abstraite pour y mettre le __call() et que toutes tes classes filles héritent derrière.

:)

Commentaire de guill76 le 18/02/2007 14:07:00

Salut, ce concept existe déjà dans certains frameworks php il suffit de regarder prado.
Mais bon ça oblige à consacrer 1 à 2 heure de temps pour en comprendre les mécanismes, alors qu'ici c'est quand même moins dense et c'est plutôt clair.

Commentaire de guill76 le 18/02/2007 14:14:45

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.:-)

Commentaire de dwarft le 19/02/2007 17:17:17

Ton code est vraiment sympa.
Cela ressemble beaucoup au design pattern d'état. L'idée est vraiment à creuser.
coooooool

Commentaire de spottydj le 04/04/2007 18:14:33

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 !

Commentaire de mouradinfo le 13/07/2008 10:19:13

bon jour,
as que il y a comme : onclick(),onchange(),onmosumove()...............ect.

Commentaire de spottydj le 13/07/2008 14:28:17

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Probleme INNER JOIN avec 3 tables [ par christuckers ] Bonjour amis CSistes.Je vous appelle aujourd'hui, car j'ai un probleme vraiment bête, mais je ne trouve pas le bon raisonnement qu'il faudrait avoir.J Listing 1 seul enregistrement [ par christuckers ] Amis CSistes, bien le bonjour.....J'ai posé une question hier après midi, par rapport à la fonction INNER JOIN, qui n'est apparament pas disponible su event schedule qui ne s'exécute pas [ par habroc ] Bonjour à tous , Voilà : je cherche à réaliser un event schedule pour déclencher un évènement ( passage de mes prix de vente de x à x*0.99 ) tous les problème mysql_fetch_array() [ par florianj54 ] Bonsoir, J'aimerais remplir un tableau en récupérant les valeurs dans ma base de données. ma base est construite comme ceci : TypeSport | VilleEv agenda [ par fazni ] slt j'ai besoin d'une calendrier qui me permett d'afficher l'evenement dans infobull quand passer sur un jour d'evenement merci d'avance création d'un script qui compte le nbr de caractère [ par oitsuki ] Bonjour, Je suis entrain d'intégrer dans le cadre d'un petit développement un javascript qui a pour objectif de décompter le nombre de caractères ins Dernière de l'année [ par eva4 ] Héllo à tous [^^happy17] J'aurais souhaitée savoir s'il était possible avec un script php ou javascript d'emettre un beep lord d'un evenement (je pen l'evenement onchange avec 2 combobox [ par emii ] Bonjour, voile mon probleme j ai deux combobox la deusieme combobox doit etre remplit en se basant sur le choix effectuer dans la premiere combobox evenement on change [ par ishak1990 ] slt je cherche un exemple en php qui explique l'utilisation de onchange (simple) le probleme esl le suivant je veux creer un champs de recherche des Afficher liste réponses plugin Wordpress [ par alumni92 ] Bonjour à tous, je suis nouveau sur le forum et "débutant" en PHP. Voici mon problème : J'ai un site spécialisé dans l'événementiel. Les participant


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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,718 sec (4)

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