begin process at 2012 02 15 18:48:14
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CLASSE DE GESTION AVANCÉE DES COOKIES

CLASSE DE GESTION AVANCÉE DES COOKIES


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :cookie, singleton, gestion Niveau :Débutant Date de création :15/04/2007 Vu / téléchargé :5 093 / 319

Auteur : LocalStone

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

 Description

Salut,
Pour un projet, j'avais besoin de gérer un nombres relativements importants de cookies de manière simple. Du coup, j'ai codé 2 classes : CookiesManager et Cookie. La classe CookiesManager permet de répertorier tous les cookies et les transforme en instance de la classe Cookie, plus simple à gérer qu'avec les fonctions natives de PHP, puisque qu'un grand nombre d'opérations sont simplifiées.
CookiesManager est un singleton, donc l'instance se récupère grâce à la méthode getInstance(). La fonction principale du gestionnaire est la possibilité de récuperer un cookie à partir de son nom grâce à la méthode getCookieByName($name).
Cookie est très simple a utiliser : lorsque l'on crée un nouveau Cookie, il va automatiquement s'ajouter à la liste des cookies du gestionnaires de cookies. La suppression d'un cookie se fait via la méthode delete(). On peut changer la date d'expiration du cookie via la méthode setExpiration($expiration), cet qui va impliquer une mise à jour automatique de toutes les variables du cookie ... Enfin, pour enregister une variable et récuperer, il faut utiliser les méthodes setVariable($key, $value) et getVariableValueByKey($key).
L'utilisation est donc très simple, et mieux vaut un bon exemple plutôt que de longues explications ...

Source

  • <?php
  • /* -------------------- */
  • require_once('cookies/cookiesmanager.class.php');
  • require_once('cookies/cookie.class.php');
  • /* -------------------- */
  • $manager = CookiesManager :: getInstance();
  • try
  • {
  • $user = $manager -> getCookieByName('user');
  • }
  • catch(NotExistingCookieException $e)
  • {
  • $user = new Cookie('user', Cookie :: END_OF_SESSION);
  • /* Pour un cookie qui dure 30 secondes, on peut faire :
  • $user = new Cookie('user', time() + 30);
  • ou
  • $user = new Cookie('user');
  • $user -> setExpiration(time() + 30); */
  • $user -> setVariable('name', (isset($_GET['name'])) ? $_GET['name'] : 'Visiteur');
  • $user -> setVariable('seen', 0);
  • }
  • $seen = $user -> getVariableValueByKey('seen');
  • $seen++;
  • $user -> setVariable('seen', $seen);
  • /* -------------------- */
  • echo '<pre>';
  • $name = $user -> getVariableValueByKey('name');
  • echo 'Salut à toi '.$name.', tu as vu cette page '.$seen." fois en 30 secondes ! \r\n";
  • echo '</pre>';
  • /* -------------------- */
  • ?>
<?php
/* -------------------- */
   require_once('cookies/cookiesmanager.class.php');
   require_once('cookies/cookie.class.php');
/* -------------------- */
   $manager = CookiesManager :: getInstance();
   try
   {
      $user = $manager -> getCookieByName('user');
   }
   catch(NotExistingCookieException $e)
   {
      $user = new Cookie('user', Cookie :: END_OF_SESSION);
      /* Pour un cookie qui dure 30 secondes, on peut faire :
         $user = new Cookie('user', time() + 30);
         ou
         $user = new Cookie('user');
         $user -> setExpiration(time() + 30); */
      $user -> setVariable('name', (isset($_GET['name'])) ? $_GET['name'] : 'Visiteur');
      $user -> setVariable('seen', 0);
   }
   $seen = $user -> getVariableValueByKey('seen');
   $seen++;
   $user -> setVariable('seen', $seen);
/* -------------------- */
   echo '<pre>';
   $name = $user -> getVariableValueByKey('name');
   echo 'Salut à toi '.$name.', tu as vu cette page '.$seen." fois en 30 secondes ! \r\n";
   echo '</pre>';
/* -------------------- */
?>

 Conclusion

Alors je sais qu'il n'y a pas de commentaires ... En fait, j'en avais mis plein, mais j'ai tout effacé lors d'une première refonte. Mais je compte commenter et mettre à jour dès que j'ai un peu de temps :)
++ !
L.S.

 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


 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 MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
Source avec Zip SIMPLETEMPLATE par thunderhunter
Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GESTION DE SCOLARITÉ [PHP] ET [MYSQL] par ayoubshadow
Source avec une capture ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ par zlatan51
Source avec Zip Source avec une capture GESTION DE RECETTE DE CUISINE par angelz
Source avec Zip Source avec une capture SYSTEM DE VOTE AJAX. par Dav_c
IDENTIFICATION PAR COOKIES SIMPLE ET ADAPTABLE par cod57

Commentaires et avis

Commentaire de FhX le 16/04/2007 01:37:08

Du Get/Set en trop ^^

Utilise __get($var) et __set($var, $val) c'est tout aussi simple et rapide :)

$seen = $user->seen;
$seen++;
$$user->seen = $seen;
// ou :
$user->seen++;

Pareil pour le manager :
$user = $manager->nom_du_cookie;

Tu peux même garder en cache le contenu du cookie :

class manager {

  public function __get($cookiename) {
    if ( !isset(self::$_cookie[$cookiename]) )
         self::$_cookie[$cookiename] = new Cookie($cookiename);
   return self::$_cookie[$cookiename];
  }

}

Ce qui permet par la suite :
$manager->nom_du_cookie->seen++;

unset($manager->nom_du_cookie); // détruira l'objet.
Tout ca tranquillement :)

Bref, quelques petits trucs à revoir (je précise que j'ai pas regardé le fichier source. J'ai juste regardé comment tu as présenté ton exemple.
En bref, je n'ai regardé que l'interface pour utiliser tes objets, pas le code en profondeur :))

Commentaire de kankrelune le 16/04/2007 16:22:31

Comme FhX... je rajouterais juste un détail pas bien méchant mais qui m'a sauté au yeux... enfin ça reste un détail... dans...

$user = new Cookie('user', time() + 30);

et

$user -> setExpiration(time() + 30);

pourquoi ne pas intégrer le time() dans la méthode ça simplifie le truc...

$user = new Cookie('user',30); // temps de vie de 30 secondes
$user->setExpiration(-30); // cookie expiré depuis 30 secondes

Sachant qi'il est plus que rare de trouver un cookie dont le temps de vie est en secondes tu pourrais même passer le paramètre en minutes en intégrant un *60 dans ta méthode... .. .

@ tchaOo°

Commentaire de oox le 22/04/2007 12:19:24

Je pense que ton singleton est bien trop lourd pour une telle classe. Tu as ajouter un certain nombre de méthodes fortuites selon moi ... Pour ton singleton :

private static $_instance = null;

public function getInstance()
{
    if (self::$_instance === null) self::$_instance = new self();
    return self::$_instance;
}

private function __construct() { ... }

Commentaire de Gorrk le 25/04/2007 14:09:49

Bon, personnellement, je pense pas que ce soit intéressant de mettre en public la fonction clone() et de renvoyer une exception, n'aurait-ce pas été plus simple de le mettre en private ?

Sinon, oui, la fonction getInstance est incorrecte : elle retourne une nouvelle instance à chaque appel, prend exemple sur celle de oox.

Dans un autre domaine, je ne pense pas qu'il soit mieux d'utiliser __get et __set que de créer des "getter" et des "setter" classiques, autant parce que c'est moins rapide à l'exécution que parce que cela ne marche pas dans le cas où l'on utilise des noms de membres existants (Name, Expiration, Variables).

Commentaire de FhX le 25/04/2007 15:33:03

"autant parce que c'est moins rapide à l'exécution que parce que cela ne marche pas dans le cas où l'on utilise des noms de membres existants (Name, Expiration, Variables)."
Totalement faux.
Contre-exemple :

class x {
private $y;

public function get($var) {
  return $this->$var;
}
public function set($var, $val) {
  $this->$var = $val;
}
}
// Je passe volontairement sur les tests de détection de propriétées existantes où non.

$x = new x;
echo $x->y;
$x->y = 10;
echo $x->y;

Ca marche aussi bien.

Si tu as une classe qui possède 30getters, 30 setters... c'est qu'il y a un problème de conception de ta classe.
Moi je m'amuse pas à ca, la programmation n'est pas faite pour se compliquer la vie, mais bien de la rendre plus facile.

Moins rapide à l'éxécution ? Parce que tu trouves que :
public function getY() {
  return $this->y;
}
C'est rapide ?
Ca ne sert strictement à rien ce genre de truc.

public function __get($var) {
if ( property_exists($this, $var) )
  return $this->$var;
}

Mais généralement, tu utilises __get() quand tu as un tableau en propriété :

private $array = array('x' => 'machin', 'y'=>'truc');
public function __get($var) {
if ( property_exists($this, $var) )
      return $this->$var;
elseif ( array_key_exists($var, $array) )
      return $this->array[$var];
else
      throw new Exception(...);
}

Voila à quoi sert un Getter généralisé. A ne plus se faire chier avec 30 getters/setter qui remplissent des lignes inutilements.

Commentaire de Gorrk le 25/04/2007 16:39:32

Après reflexion, je suis d'accord avec toi, dans le cas où l'on travaille avec des attributs dont on ne connait pas le nom au moment du code, on peut utiliser __get() et __set(), mais dans le cas où l'on sais sur quel membre travailler, il est bien mieux de faire des getMachin() et des setMachin($valeur), ne serait-ce que pour la gestion des erreurs. D'autant plus qu'il est plus lent (je persiste) de faire ces vérifications dans __get() ou __set() car elles n'ont lieu qu'à l'execution alors que la vérification de l'existence des méthodes getMachin() et setMachin($valeur) a lieu lors de la phase de compilation.

Quand je dis que "cela ne marche pas dans le cas où l'on utilise des noms de membres existants", c'est vrai, dans ton dernier exemple, "echo $object->array;" ne fonctionnera pas car le membre existe et sa visibilité es private.

Manuel PHP :
Les appels de méthodes et l'accès aux membres peuvent être surchargés via les méthodes __call(), __get()  et __set(). Ces méthodes ne seront déclenchées que si votre objet, hérité ou non, ne contient pas le membre ou la méthode auquel vous tentez d'accéder.

Commentaire de FhX le 25/04/2007 19:16:52

"ne serait-ce que pour la gestion des erreurs."
En effet, et pour cela pas besoin de 30 get/set.
A partir du moment ou tu as 2 méthodes :
getTruc() return $this->truc;
setTruc($val) $this->truc = $val;

Y'a un problème.
Autant mettre la propriété en public.

"alors que la vérification de l'existence des méthodes getMachin() et setMachin($valeur) a lieu lors de la phase de compilation."
Totalement faux aussi. Je peux faire une méthode qui va faire un get() sur une propriété inexistante, et l'erreur ne se produira que lors de l'appel de la méthode erronée.

Y'a un bench pour prouver que get/set est plus lent ?

Commentaire de Gorrk le 25/04/2007 20:15:23

Tu connais les principes de la POO ?
Ca te dit quelque chose le principe d'encapsulation ?
On ne doit jamais, je dit bien jamais mettre une propriété en public.
Jette un oeil sur cette article de Wikipédia : http://fr.wikipedia.org/wiki/Encapsulation_%28programmation%29.

Sur le second point, tu mélange absolument tout, je parle d'une méthode getMachin(), pas d'une méthode get($machin), car évidemment, dans cette dernière version, c'est équivalent à __get($machin).

Alors, avant d'affirmer que quelque chose est "totalement faux", essaie de comprendre ce que te dis ton interlocuteur et renseigne toi sur le fonctionnement d'un interpréteur/compilateur.

Commentaire de FhX le 25/04/2007 21:16:32

Youpi, jme suis trouvé quelqu'un à qui parler !

"Tu connais les principes de la POO ?"
Non, je ne connais absolument rien de la POO, tu as totalement raison.

"Ca te dit quelque chose le principe d'encapsulation ?"
Le principe d'encapsulation n'a jamais obligé le developpeur a n'utiliser exclusivement le private/protected et a bannir le public.
Il est certe utilisé pour faire une "boite noire" pour chaque instance de classe, et cela est utile lorsque l'on veut filtrer les données entrantes.

Cependant, l'orientée objet n'oblige pas l'utilisation de ce principe, et c'est bien là où tu fais erreur. Pour toi, objet = principe d'encapsulation. C'est totalement faux. Je n'ai jamais entendu rien de tel jusqu'à présent.
L'utilisation du statissisme par exemple ne fait pas partie du principe d'encapsulation.
Avant de me balancer le principe d'encapsulation en pleine tronche simplement pour faire beau, fais attention à ne pas faire l'analgame : "je fais un objet, j'utilise forcément le principe d'encapsulation".

"Sur le second point, tu mélange absolument tout, je parle d'une méthode getMachin(), pas d'une méthode get($machin), car évidemment, dans cette dernière version, c'est équivalent à __get($machin)."
J'avoue que même en me relisant, je ne comprends toujours pas ce que tu viens de me dire. Ah si ca y est :
"Je peux faire une méthode qui va faire un get() sur une propriété inexistante, et l'erreur ne se produira que lors de l'appel de la méthode erronée."
Il fallait y lire :
"Je peux faire une méthode qui va faire un getMachin() sur une propriété inexistante, et l'erreur ne se produira que lors de l'appel de la méthode erronée."

"Alors, avant d'affirmer que quelque chose est "totalement faux", essaie de comprendre ce que te dis ton interlocuteur et renseigne toi sur le fonctionnement d'un interpréteur/compilateur."
Ouh, alors la c'est dur comme critique. Je ne pensais pas que quelqu'un irait jusque la. Je pensais qu'avoir fait des sources largement orientées objet ici me prémunirais contre ce genre d'attaque infondée.


J'ai autre chose à branler que de venir cracher sur toi ou sur quiconque. Car, si c'est bel et bien à cela que tu te destines en voulant te confronter à moi, sache que je suis pret à changer le ton de mes réponses.
Pour le moment, je me veux le plus courtois possible. Ce n'est pas parce que j'ai dis que ton raisonement était faux que j'ai dis que tu étais un pauvre naze et qu'il fallait que tu fermes ta gueule parce que tu avais tord.

Je suis ouvert à tout débat, en particulier sur la POO, tant que cela reste dans le cadre du respect. J'ignorerai donc tes attaques personnelles cette fois ci, mais si cela revient à recommencer une nouvelle fois, je n'hésiterai pas à passer moi aussi à l'offensive.

Mais pour le moment, le niveau de mes sources comparé aux tiennes me confortent dans l'idée que pour le moment, je ne crains absolument rien de ta part :)


Sur ce, je mentiens ce que je dis. En effet, tu n'as pas réussi à me convaincre du mal-fondé de mes pensées... en tout cas pas avec 4 phrases chocs et un lien sur wikipedia :s
Si tu comptes me faire valoir ton point de vue, il va falloir trouver mieux.

Je suis ouvert à tout.

Commentaire de Gorrk le 26/04/2007 15:37:28

Je suis désolé de mettre laissé emporter dans mon dernier message, je n'avais pas vu que tu était "le plus courtois possible" et "ouvert à tout débat", j'ai certainement mal interprété ton "totalement faux" car il m'a semblé que tu étais fermé et condescendant, et je m'en excuse donc.

Avant de clore cette discussion qui me semble stérile (désolé LocalStone de légèrement encombrer ton post), je souhaiterais revenir sur le principe d'encapsulation qui est, selon moi, un des principes les plus importants de la POO (avec l'héritage, le polymorphisme, ...) car c'est elle qui garantie l'évolutivité de ton code :  si tu t'aperçois finalement que tu dois vérifier quelque chose lors de la mise un jour d'un membre, le fait de l'avoir déclaré public et de le modifier directement va compliquer la mise à jour de ton code et va (probablement) t'obliger à changer également les sources reposant sur ta classe pour, par exemple, remplacer la modif. directe du membre par une méthode chargée de la vérification. Alors que si tu utilisais depuis le début des méthodes d'accès, tu n'aurais qu'a la modifier quelque peu.

Sinon, qu'appelle tu le statissisme ? C'est le fait de regrouper des fonctions dans un espace de nom ?

Commentaire de FhX le 26/04/2007 20:14:24

Je suis d'accord avec toi sur le fait d'évolution garanti avec l'encapsulation. Il est vrai qu'il est l'unique moyen d'être sûr à 100% que lors d'une modification de la classe, les choses marcheront toujours de la même facon.
Mais généralement, quand on utilise une propriété publique, c'est qu'on s'en fou un peu quand même.
Par exemple, une classe SQL. Tu peux récupérer le numéro de version du serveur MySQL, mais pas besoin d'un getter pour ca, il suffit de mettre la propriété en publique. Qu'importe de toute facon, elle ne fait rien de bien spécifique à la classe de toute facon.

Voila pourquoi je disais qu'il ne faut pas tout encapsuler :) Mais d'une manière générale oui il le faut.

Le statissisme, oui c'est l'espace de nom. C'est un concept objet également (bien que...).


L'autre problème que de faire du get/set, c'est qu'il faut créer l'interface qui va avec. Depuis PHP5, on associe les get/set avec une interface qu'on va inclure à la classe, et de ce fait on ne se reporte qu'à l'interface pour l'accès au méthode.

L'encapsulation est une bonne chose, mais doit être utilisé correctement :)

Commentaire de marc660 le 19/07/2007 19:26:57

Bonjour,

Votre script ne fonctionne pas sur deux serveurs différent et aussi sur EasyPHP 2.0.0.0
Ou c’est une erreur ligne 8 dans index.php
Parse error: parse error, unexpected '{' in /homepages/30/d160718081/htdocs/Le-Facturier/teste/phpcs_CLASSE-GESTION-AVANC-201-COOKIES_42290/index.php on line 8

Ou sur un autre serveur ligne est EasyPhp Ligne106 dans cookie.class.php

Fatal error: Cannot use string offset as an array in D:\Program Files\EasyPHP 2.0b1\www\phpcs_CLASSE-GESTION-AVANC-201-COOKIES_42290\cookies\cookie.class.php on line 106


Comment corriger ce problème car je cherche un m’oyent d’enregistrer les valeurs des champs d’un formulaire.


Merci

Commentaire de marc660 le 20/07/2007 01:18:34

C'est pas grave

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

aide pour creation de gestion de divx [ par karen ] bonjour a tous j'essai de cree en vain un script me permettant de gere mes divxen fait je veut faire ceciune partie administration avec pass (ca j'ai Cookies, mettre et relire DES Variables [ par codefalse ] Hello allcomment je pourrai faire pour mettre deux variables dans un cookie ( pseuod et pass ) et les relire dans le bon ordre ( mettre dans la variab Formulaire et Gestion de dates. [ par benett ] Bonjour à tous,J'aimerais vous poser une petite question, voici :Comment peut-on à partir d'un formulaire, générer un calendrier qui permetrais l'enco cookie de m.... [ par booth ] bonjour...voilà j'ai un problème avec la durée de vie des cookies.Le truc c'est que la durée de vie d'un cookie est soumise à différentes actions de l Gestion de dates [ par benett ] Bonjour à tous,comment faire la soustraction entre 2 dates et obtenir le résultat en jour ?Merci beaucoup. Cookie et fonction [ par Masterfight ] Salut,j'ai un cookie qui a cette gueule :$panier[paris]$panier[newyork]etcPuis-je, et si oui comment, passer le "paris" en paramètres das une fonction Prise en compte d'un cookie et rafraichissement fenêtre [ par joel64 ] bonjour,merci à celui ou celle qui me donnera la solution au problème suivant.il s'agit d'un script php de sondage qui affiche la possibilité de vote pb gestion des erreures [ par tich69 ] salut j'ai un pb !!! lol c pour ca que je suis ici !dans ma page php g mis ------------ or die("") pour eviter les erreurs mais ceci arrete totalemen Gestion d'horaires de réservation de salles [ par houloul ] Bonjour,je tente de faire une application de gestion de salles....Mon problème est le suivant :j'ai une table réservation qui contient un numéro de ré gestion de pdf en php [ par jawad75 ] salut tous le mondeje coulais savoir juste si qlq un a deja fais un prog qui gere des .pdf en php, en utilisant fpdf :)


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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 : 4,118 sec (3)

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