begin process at 2012 05 27 17:47:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > PHP EVENTS MANAGER

PHP EVENTS MANAGER


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :évènement, évènementielle, objet, psykocrash Niveau :Débutant Date de création :25/08/2007 Date de mise à jour :26/08/2007 18:37:51 Vu / téléchargé :6 384 / 174

Auteur : psykocrash

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


 Description

Cette application distribuée sous licence LGPL permet la programmation évènementielle en PHP5. Elle permet aussi de simplifier l'installation d'un système de plugins dans vos applications.

Explication rapide :
1. Créer un évènement.
2. Créer des hooks. Ce sont des fonctions qui seront appelées lors du déclenchement des évènements.
3. Déclencher l'évènement.

Il suffit de lire le code source pour comprendre le fonctionnement très simple de l'application.

Source

  • <?php
  • /*
  • ** PHP Events Manager
  • ** Version 1.2.1 (26/08/2007)
  • ** Auteur : Psykocrash (SERRAJ Younes)
  • **
  • ** PHP Events Manager. Programmation évènementielle en PHP5.
  • ** Copyright (C) 2007 SERRAJ Younes - Tous droits réservés.
  • **
  • ** Licence : http://www.gnu.org/licenses/lgpl.txt
  • **
  • ** Cette bibliothèque est un logiciel libre ; vous pouvez la redistribuer ou
  • ** la modifier suivant les termes de la Licence Générale Publique Limitée
  • ** GNU telle que publiée par la Free Software Foundation dans la version 2.1
  • ** de la License.
  • **
  • ** Cette bibliothèque est distribuée dans l’espoir qu’elle sera utile, mais
  • ** SANS AUCUNE GARANTIE : sans même la garantie implicite de
  • ** COMMERCIABILISABILITÉ ou d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez
  • ** la Licence Générale Publique Limitée pour plus de détails.
  • ** ** Vous devriez avoir reçu une copie de la Licence Générale Publique Limitée
  • ** avec cette bibliothèque ; si ce n’est pas le cas, écrivez à la :
  • ** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  • ** MA 02111-1307, USA.
  • */
  • if (!defined('PEM_PHP5_'))
  • {
  • define('PEM_PHP5_', true);
  • class PEM
  • {
  • protected static $events_list = array();
  • public static $safe_mode = false;
  • /*
  • ** Cette fonction cré un évènement
  • ** sur lequel pourront être placés
  • ** des hooks.
  • */
  • public static function create_event($event_name)
  • {
  • $event_exists = self::event_exists($event_name);
  • if (self::$safe_mode === true && $event_exists === true)
  • throw new Exception("[Safe Mode] L'évènement ''" . htmlspecialchars($event_name) . "'' existe déjà.");
  • if (!$event_exists)
  • self::$events_list[$event_name] = array();
  • }
  • /*
  • ** Cette fonction vérifie si un
  • ** d'évènement existe.
  • **
  • ** Return: true/false.
  • */
  • public static function event_exists($event_name)
  • {
  • if (!is_array(self::$events_list)) return false;
  • if (array_key_exists($event_name, self::$events_list) === true)
  • return true;
  • else
  • return false;
  • }
  • /*
  • ** Cette fonction déclanche un évènement.
  • */
  • public static function raise_event($event_name, $params = '')
  • {
  • if (!self::event_exists($event_name))
  • throw new Exception("L'évènement ''" . htmlspecialchars($event_name) . "'' n'existe pas.");
  • foreach (self::$events_list[$event_name] as $function_name_to_call)
  • {
  • if (!function_exists($function_name_to_call))
  • throw new Exception("La fonction ''" . htmlspecialchars($function_name_to_call) . "'' n'existe pas.");
  • if (is_array($params))
  • call_user_func_array($function_name_to_call, $params);
  • else
  • call_user_func($function_name_to_call, $params);
  • }
  • }
  • /*
  • ** Cette fonction supprime un évènement
  • ** et tous les hooks liés.
  • */
  • public static function delete_event($event_name)
  • {
  • if (!self::event_exists($event_name))
  • {
  • if (self::$safe_mode === true)
  • throw new Exception("[Safe Mode] L'évènement ''" . htmlspecialchars($event_name) . "'' n'existe pas.");
  • }
  • else
  • unset(self::$events_list[$event_name]);
  • }
  • /*
  • ** Cette fonction cré un hook sur
  • ** un évènement.
  • */
  • public static function create_hook($event_name, $function_name_to_call)
  • {
  • if (!function_exists($function_name_to_call))
  • throw new Exception("La fonction ''" . htmlspecialchars($function_name_to_call) . "'' n'existe pas.");
  • if (!self::event_exists($event_name))
  • throw new Exception("L'évènement ''" . htmlspecialchars($event_name) . "'' n'existe pas.");
  • $hook_exists = self::hook_exists($event_name, $function_name_to_call);
  • if (self::$safe_mode === true && $hook_exists === true)
  • throw new Exception("[Safe Mode] Le hook ''" . htmlspecialchars($event_name) . '->' . htmlspecialchars($function_name_to_call) . "'' existe déjà.");
  • self::$events_list[$event_name][$function_name_to_call] = $function_name_to_call;
  • }
  • /*
  • ** Cette fonction vérifie si un
  • ** hook existe.
  • **
  • ** Return: true/false.
  • */
  • public static function hook_exists($event_name, $function_name_to_call)
  • {
  • if (!self::event_exists($event_name))
  • throw new Exception("L'évènement ''" . htmlspecialchars($event_name) . "'' n'existe pas.");
  • if (array_key_exists($function_name_to_call, self::$events_list[$event_name]) === true)
  • return true;
  • else
  • return false;
  • }
  • /*
  • ** Cette fonction supprime un hook
  • ** existant.
  • */
  • public static function delete_hook($event_name, $function_name_to_call)
  • {
  • if (!self::hook_exists($event_name, $function_name_to_call))
  • {
  • if (self::$safe_mode === true)
  • throw new Exception("Le hook ''" . htmlspecialchars($event_name) . '->' . htmlspecialchars($function_name_to_call) . "'' n'existe pas.");
  • }
  • else
  • unset(self::$events_list[$event_name][$function_name_to_call]);
  • }
  • }
  • }
  • ?>
<?php

/*
** PHP Events Manager
** Version 1.2.1 (26/08/2007)
** Auteur : Psykocrash (SERRAJ Younes)
** 
** PHP Events Manager. Programmation évènementielle en PHP5.
** Copyright (C) 2007 SERRAJ Younes - Tous droits réservés.
** 
** Licence : http://www.gnu.org/licenses/lgpl.txt
** 
** Cette bibliothèque est un logiciel libre ; vous pouvez la redistribuer ou
** la modifier suivant les termes de la Licence Générale Publique Limitée
** GNU telle que publiée par la Free Software Foundation dans la version 2.1 
** de la License.
** 
** Cette bibliothèque est distribuée dans l’espoir qu’elle sera utile, mais
** SANS AUCUNE GARANTIE : sans même la garantie implicite de
** COMMERCIABILISABILITÉ ou d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez
** la Licence Générale Publique Limitée pour plus de détails.
** ** Vous devriez avoir reçu une copie de la Licence Générale Publique Limitée
** avec cette bibliothèque ; si ce n’est pas le cas, écrivez à la :
** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
** MA 02111-1307, USA.
*/

if (!defined('PEM_PHP5_'))
	{
		define('PEM_PHP5_', true);
		
		class PEM
			{
				protected static $events_list = array();
				public static $safe_mode = false;
				
				/*
				** Cette fonction cré un évènement
				** sur lequel pourront être placés
				** des hooks.
				*/
				public static function create_event($event_name)
					{
						$event_exists = self::event_exists($event_name);
						if (self::$safe_mode === true && $event_exists === true)
							throw new Exception("[Safe Mode] L'évènement ''" . htmlspecialchars($event_name) . "'' existe déjà.");
						if (!$event_exists)
							self::$events_list[$event_name] = array();
					}
				
				/*
				** Cette fonction vérifie si un
				** d'évènement existe.
				**
				** Return: true/false.
				*/
				public static function event_exists($event_name)
					{
						if (!is_array(self::$events_list)) return false;
						if (array_key_exists($event_name, self::$events_list) === true)
							return true;
						else
							return false;
					}
				
				/*
				** Cette fonction déclanche un évènement.
				*/
				public static function raise_event($event_name, $params = '')
					{
						if (!self::event_exists($event_name))
							throw new Exception("L'évènement ''" . htmlspecialchars($event_name) . "'' n'existe pas.");
						foreach (self::$events_list[$event_name] as $function_name_to_call)
							{
								if (!function_exists($function_name_to_call))
									throw new Exception("La fonction ''" . htmlspecialchars($function_name_to_call) . "'' n'existe pas.");
								if (is_array($params))
									call_user_func_array($function_name_to_call, $params);
								else
									call_user_func($function_name_to_call, $params);
							}
					}
				
				/*
				** Cette fonction supprime un évènement
				** et tous les hooks liés.
				*/
				public static function delete_event($event_name)
					{
						if (!self::event_exists($event_name))
							{
								if (self::$safe_mode === true)
									throw new Exception("[Safe Mode] L'évènement ''" . htmlspecialchars($event_name) . "'' n'existe pas.");
							}
						else
							unset(self::$events_list[$event_name]);
					}
				
				/*
				** Cette fonction cré un hook sur
				** un évènement.
				*/
				public static function create_hook($event_name, $function_name_to_call)
					{
						if (!function_exists($function_name_to_call))
							throw new Exception("La fonction ''" . htmlspecialchars($function_name_to_call) . "'' n'existe pas.");
						if (!self::event_exists($event_name))
							throw new Exception("L'évènement ''" . htmlspecialchars($event_name) . "'' n'existe pas.");
						$hook_exists = self::hook_exists($event_name, $function_name_to_call);
						if (self::$safe_mode === true && $hook_exists === true)
							throw new Exception("[Safe Mode] Le hook ''" . htmlspecialchars($event_name) . '->' . htmlspecialchars($function_name_to_call) . "'' existe déjà.");
						self::$events_list[$event_name][$function_name_to_call] = $function_name_to_call;
					}
				
				/*
				** Cette fonction vérifie si un
				** hook existe.
				**
				** Return: true/false.
				*/
				public static function hook_exists($event_name, $function_name_to_call)
					{
						if (!self::event_exists($event_name))
							throw new Exception("L'évènement ''" . htmlspecialchars($event_name) . "'' n'existe pas.");
						if (array_key_exists($function_name_to_call, self::$events_list[$event_name]) === true)
							return true;
						else
							return false;
					}
				
				/*
				** Cette fonction supprime un hook
				** existant.
				*/
				public static function delete_hook($event_name, $function_name_to_call)
					{
						if (!self::hook_exists($event_name, $function_name_to_call))
							{
								if (self::$safe_mode === true)
									throw new Exception("Le hook ''" . htmlspecialchars($event_name) . '->' . htmlspecialchars($function_name_to_call) . "'' n'existe pas.");
							}
						else
							unset(self::$events_list[$event_name][$function_name_to_call]);
					}
			}
	}

?>

 Conclusion

J'ai choisis la catégorie Divers parce que je ne sais vraiment pas laquelle choisir.

Si vous avez des idées d'amélioration, n'hésitez pas. Dans son état naissant, cette application remplit déjà pleinement sa fonction, mais on peut toujours la développer ;)

 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

25 août 2007 14:03:01 :
Possibilité de déclencher les évènements en les appelant comme des méthodes de la classe PEM. Gestion des erreurs via exceptions. Correction de deux bugs.
26 août 2007 18:37:51 :
Classe désormais statique. Utilisation des comparaisons strictes.

 Sources du même auteur

PROTECTION CONTRE LE XSS ET L'SQL INJECTION
Source avec Zip ABDMYSQL V1.4.8 ACCÈS AUX BASES DE DONNÉES MYSQL.

 Sources de la même categorie

Source avec une capture MODULE JOOMLA 1.5 NOW LISTENING par Alcantornet
Source avec Zip Source avec une capture UPLOAD CENTER par basssem81
Source avec Zip COMPTEUR DE CLIQUE PHP AVEC JQUERY par devgoneti
Source avec Zip LIVRE D'OR SIMPLE (POUR DÉBUTANT) par devgoneti
Source avec Zip SCRIPT TRAVAUX POUR VOTRE SITE par FleuryK

 Sources en rapport avec celle ci

FORM, ORM POUR FORMULAIRE par choy
Source avec Zip Source avec une capture MOTEUR DE RENDU DE FICHIER 3D (WAVEFRONT OBJ POUR LE MOMENT)... par ciberrique
Source avec Zip Source avec une capture [POO] MENU XHTML HORIZONTAL EXTENSIBLE (MENUEXTENSIBLEX.PHP) par Dariumis
Source avec Zip Source avec une capture [POO] OBJET CONVERTISSANT UN NOMBRE DE SECONDES EN DIFFÉRENT... par Dariumis
Source avec Zip MY.REMOTE : SERVEUR D'OBJETS PHP5 par inwebo

Commentaires et avis

Commentaire de jdalton42 le 25/08/2007 03:19:17

salut

t'a pas un lien qui donne les différences entre php4 et php5 stp ?

Commentaire de malalam le 25/08/2007 09:23:43 administrateur CS

Hello,

ce n'est pas franchement une application, c'est une méthode de programmation. Tu devrais mater le code que j'ai écrit il y a peu :
http://www.phpcs.com/codes/PHP5-OBSERVER-DESIGN-PATTERN_43478.aspx

Et t'en rapprocher, parce que ce design pattern est plus efficace que ton code actuel : tu ne gère qu'une fonction quand on peut gérer des objets entiers. Tu ne profites pas de la pleine puissance de PHP5 (et de la SPL notamment qui propose DEJA tout ce qu'il faut pour gérer les évènements, comme le montre mon code). Tu ne peux pas déclencher d'évènements en cascade facilement, avec ce code : tu es limité à UN évènement sauf à tous les appeler explicitement.
Côté programmmation, vu que tu codes en PHP5, tu devrais faire des comparaisons strictes.
Si la fonction à délencher n'existe pas, tu devrais lever une exception, et pas simplement faire un return false.

Commentaire de psykocrash le 25/08/2007 13:36:38

Merci pour tes remarques.

Je me suis renseigné à propos du design pattern Observer, et ce n'est pas du tout ce que je cherche à faire. De ce que j'ai compris, il y a les sujets, et les observateurs, mais tout ça se passe à l'intérieur d'un objet. Mon objectif avec mon application/méthode c'est de pouvoir placer des évènements partout dans mon code (dans la partie "globale"), pas de gérer des évènements au sein d'un objet.

Pour la SPL, j'ai jeté un oeil sur php.net, mais je t'avoue ne pas voir en quoi elle m'aiderait.

Pour le fait d'être limité à une seule fonction, si j'ai bien compris ce que tu voulais dire, et bien non. Pour chaque évènement, tu peux placer autant de hooks que tu le souhaites (hook ici = fonction à appeler). D'ailleurs j'ai une petite idée d'amélioration à ce sujet que je vais implémenter dans la prochaine version.

Pour les exceptions, tu as raison, je vais faire une mise à jour tout de suite.

D'autres remarques/suggestions ?

Commentaire de malalam le 25/08/2007 16:21:46 administrateur CS

L'observer pattern fait très exactement ce que ta classe fait. En implémentant une norme histoire de s'y retrouver facilement. Tu lies un déclencheur à un évènement.  Sauf que l'avantage est de pouvoir :
- utiliser un objet complexe comme "hook"
- de déclencher plusieurs actions en cascade : ce n'est pas tout à fait ce que tu as compris. Un évènement entraîne X actions. C'est possible avec ta classe mais pas simplement, et tu n'as aucune interaction possible avec ton environnement. Réagir à un changement est intéressant sans que tu aies à appeler MANUELLEMENT ta fonction. Ta classe ne fonctionne pas comme un trigger. Ou du moins, encore une fois, pas facilement.

Pour la SPL, à jouer avec les itérateurs. Ton objet gagnerait à étendre ArrayIterator, si tu veux que je sois précis. Ou alors, une autre solution est celle que j'ai utilisée : ton event_list doit être un SPLObjectStorage, ce qui t'évite de définir tes méthodes create_event() et compagnie.

Mais bon..ce que j'en dis, moi :-)

Commentaire de psykocrash le 25/08/2007 16:40:19

Ce que t'en dis m'intéresse, sinon j'aurais pas posté mon code ici ;)

Reprenons :

Les évènements ici ne dépendent pas d'un changement d'état comme le voudrait l'Observer design pattern, un évènement peux intervenir n'importe quand, n'importe où, et sans raison. Dans ces conditions, difficile d'associer un sujet, ainsi que ses états, à un observateur précis. Moi je veux bien utiliser ce design pattern, mais faudra m'expliquer comment faire dans cette configuration...

Sinon tu as parlé à plusieurs reprises de passer en paramètre des objets plutôt que des fonctions. Vu que le but est d'appeler des fonctions, je comprend pas pourquoi utiliser des objets ?

Commentaire de malalam le 25/08/2007 17:22:14 administrateur CS

Un état n'est pas forcément un entier. Un état c'est ce qu'est devenu le contexte après un évènement donné. C'est bien à ça que tu veux réagir ? A un évènement. Quand tu dis "n'importe où, n'importe quand, et sans raison" ce n'est pas de la programmation évènementielle : cela revient à...appeler une fonction. Et pour ça, pas besoin d'une classe du tout.  Ce n'est pas n'improet où, ni n'importe quand, et certainement pas sans raison, sinon tu ne lierais pas tes évènements et tes crochets.
Si tu observes attentivement le...observer..Pattern, tu verras que c'est très exactement ce qu'il fait aussi.
Pourquoi les objets? Parce que cela remplace avantageusement tes fonctions : tu peux alors effectuer des actions bien plus complexes.

Tu n'as pas modifié tes comparaisons : tu devrais les typer. Outre que c'est plus rapide (mais bon, vu l'ordre de grandeur...) c'est surtout plus strict et correct. == true et == 1 sont identiques. Alors que === true est très différent de === 1. Cela peut avoir son importance, et dans ce sens, il est mieux de prendre l'habitude de coder ainsi.
Coté code encore, vu comment tu as codé ta classe et comment tu dois l'utiliser, tu aurais dû la rendre entièrement statique : toutes les propriétés, et toutes les méthodes. Il est totalement inutile d'instancier ta classe pour l'utiliser. A dire vrai, puisque tu veux ne pas l'utiliser dans un contexte très orienté POO, c'est même bien mieux de ne pas l'instancier.

Commentaire de ornythorink le 28/08/2007 16:24:22

le commentaire va être trivail mais enfin des commentaires et réactions constructives. Dans un sens je comprend l'erreur de compréhension du pattern Observer j'ai fais la même ;)
Bon courage

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Valeur retourné par un Objet de Type image??? [ par DJPGM ] C quoi la valeur que retourne une image comme dans l'exemple suivant???&lt;form name="ChoixImage" method="post" action="Images.php" &gt; &lt;input Passage d'url trop long [ par matmax ] J ai un problème lorsque je veux passer un objet d'une page à une autre ou rappeller ma page avec un traitement different.J ai linéarisé mon objet mai probleme de classe en php [ par Elkaire ] Donc voila mon probleme!!dans une premiere page je rensegne les insances de mon objet. Une fois renseigné je peux réutiliser les instances cet objet d objet embed [ par elanspeech ] bonjour, je rencontre des problemes avec l'objet embed qui ne fonctionne pas systematiquement. son fonctionnement est aleatoire. le chemin vers le fic Gestion d'évènement souris [ par BSide ] Bonjour,j'essaie depuis un sacré moment de faire fonctionner le code qui suit...(récupéré dans la source de MySQL)Impossible de le faire tourner !!! L objet requis!! [ par saad123 ] salut!! g un p'tit probleme je cherche a faire un site de livraison de pizza mais g un prb pour calculer le montant d'une commande, j'utilise du javas Tuer un Processus Excel (objet COM) [ par nerikT ] Bonjour à tous !J'ai un grros problème.J'utilise un objet COM pour crere un fichier Excel, et à la fin du script, le processu est toujours en mémoire transferer une variable d'objet de page en page ?? [ par Arkko ] slt ... j'aimerais savoir si y'a un moyen de transferer une variable d'objet d'une page a un autre ???exemple:1.php:&lt;?MaClasse = new Maclasse;?&gt; Quand on parle de Classe [ par Tomcube ] C'est une question très vaste,On parle de plus en plus de programmation objet. Qui dit programmation objet dit classe. D'ailleurs, c'est fou le nombre Probleme avec serialize et unserialize [ par matou82 ] J'ai un objet que je serialize et passe en paramètre dans l'url d'un popup.Dans ce popup je le unserialize. Il s'agit d'un objet possédant une fonctio


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,796 sec (3)

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