begin process at 2012 05 27 18:07:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > POO - SINGLETON CLASS

POO - SINGLETON CLASS


 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 :Poo, Class, Singleton, Pattern Niveau :Débutant Date de création :08/01/2010 Date de mise à jour :13/01/2010 10:33:42 Vu :2 659

Auteur : Waredan

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

 Description

Une classe générique qui implémente le singleton design pattern en utilisant le Late Static Bindings (Résolution statique à la volée) de PHP 5.3.

Plus d'infos :
- http://fr.php.net/manual/fr/language.oop5.patterns .php
- http://fr.php.net/lsb

Source

  • <?php
  • /**
  • * Class Singleton is a generic implementation of the singleton design pattern.
  • *
  • * Extending this class allows to make a single instance easily accessible by
  • * many other objects, using the {@link Singleton::getInstance()} method.
  • *
  • * @author Quentin Berlemont <quentinberlemont@gmail.com>
  • * @copyright Copyright (C) 2010 Quentin Berlemont
  • * @license http://www.gnu.org/licenses/lgpl.html LGPLv3
  • */
  • abstract class Singleton
  • {
  • /**
  • * A protected constructor; prevents direct creation of object.
  • *
  • * @param void
  • * @return void
  • */
  • protected function __construct()
  • {
  • }
  • /**
  • * Prevents users to clone the instance.
  • *
  • * @param void
  • * @return void
  • * @throws LogicException If one tries to clone the instance.
  • */
  • final public function __clone()
  • {
  • throw new LogicException(sprintf('Cloning an instance of `%s` is not allowed.', get_class($this)));
  • }
  • /**
  • * Returns a single instance of a class the static method is called in.
  • *
  • * See the {@link http://php.net/lsb Late Static Bindings} feature for more
  • * information.
  • *
  • * @param void
  • * @return object Returns a single instance of a class.
  • */
  • final static public function getInstance()
  • {
  • static $instance = null;
  • return $instance ?: $instance = new static;
  • }
  • }
  • // Example
  • class Foo extends Singleton
  • {
  • public function __toString()
  • {
  • return __CLASS__;
  • }
  • }
  • class Bar extends Singleton
  • {
  • public function __toString()
  • {
  • return __CLASS__;
  • }
  • }
  • $foo = Foo::getInstance();
  • // prints: Foo
  • echo $foo;
  • $bar = Bar::getInstance();
  • // prints: Bar
  • echo $bar;
  • // prints: bool(true);
  • var_dump($foo === Foo::getInstance());
  • // prints: bool(true);
  • var_dump($bar === Bar::getInstance());
  • // prints: bool(false)
  • var_dump($foo === $bar);
  • // prints (LogicException): Cloning an instance of `Foo` is not allowed.
  • $baz = clone $foo;
  • ?>
<?php
/**
 * Class Singleton is a generic implementation of the singleton design pattern.
 *
 * Extending this class allows to make a single instance easily accessible by
 * many other objects, using the {@link Singleton::getInstance()} method.
 *
 * @author     Quentin Berlemont <quentinberlemont@gmail.com>
 * @copyright  Copyright (C) 2010 Quentin Berlemont
 * @license    http://www.gnu.org/licenses/lgpl.html LGPLv3
 */
abstract class Singleton
{
    /**
     * A protected constructor; prevents direct creation of object.
     *
     * @param  void
     * @return void
     */
    protected function __construct()
    {
    }

    /**
     * Prevents users to clone the instance.
     *
     * @param  void
     * @return void
     * @throws LogicException If one tries to clone the instance.
     */
    final public function __clone()
    {
        throw new LogicException(sprintf('Cloning an instance of `%s` is not allowed.', get_class($this)));
    }

    /**
     * Returns a single instance of a class the static method is called in.
     *
     * See the {@link http://php.net/lsb Late Static Bindings} feature for more
     * information.
     *
     * @param  void
     * @return object Returns a single instance of a class.
     */
    final static public function getInstance()
    {
        static $instance = null;

        return $instance ?: $instance = new static;
    }
}

// Example
class Foo extends Singleton
{
    public function __toString()
    {
        return __CLASS__;
    }
}

class Bar extends Singleton
{
    public function __toString()
    {
        return __CLASS__;
    }
}

$foo = Foo::getInstance();

// prints: Foo
echo $foo;

$bar = Bar::getInstance();

// prints: Bar
echo $bar;

// prints: bool(true);
var_dump($foo === Foo::getInstance());

// prints: bool(true);
var_dump($bar === Bar::getInstance());

// prints: bool(false)
var_dump($foo === $bar);

// prints (LogicException): Cloning an instance of `Foo` is not allowed.
$baz = clone $foo;

?>



 Historique

12 janvier 2010 17:17:30 :
Le clonage de l'instance d'une classe héritant de Singleton lèvera une "LogicException" plutôt qu'une erreur fatale.
13 janvier 2010 10:30:43 :
corrections mineures.
13 janvier 2010 10:33:43 :
Ajout d'explication sur l'utilisation de la source en exemple.

 Sources du même auteur

Source avec Zip POO - LOGGING PACKAGE
POO - OBJECT CLASS
Source avec Zip POO - FACTORY CLASS
POO - PARAMETERHOLDER CLASS

 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

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MY.EXCEPTION par inwebo
Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan
Source avec Zip POO - FACTORY CLASS par Waredan
POO - PARAMETERHOLDER CLASS par Waredan

Commentaires et avis

Commentaire de neigedhiver le 08/01/2010 22:05:28 10/10

Salut,

Ca, ça me plaît. N'ayant pas encore PHP5.3 (les distribs Linux tardent à le mettre dans leurs packages et je n'ai pas le courage de l'installer à la main, idem pour FreeBSD), je n'ai pas encore eu le plaisir de développer cette classe... Mais tu l'as fait, et c'est très bien. Parce que c'est con, mais c'est juste pas possible à réaliser en PHP5.2 ... :/
Je ne m'y serais pas pris exactement de la même manière, mais je suppose qu'à l'utilisation, c'est rigoureusement identique.

Juste une interrogation sur ta méthode __clone() : je ne sais pas si, en l'état, elle empêche réellement le clonage (peut-être, je ne sais plus). Ne serait-il pas intéressant de lancer une exception pour l'empêcher réellement ? (je veux dire obliger le développeur à prendre ça en compte pour de vrai).

Commentaire de Waredan le 09/01/2010 11:35:09

Oui, le clonage d'un objet à l'aide du mot clé "clone" fait appel à la méthode magique "__clone()" lorsqu'elle est définie dans une classe, ici, ayant une visibilité privée, une erreur fatale sera lancée.

Commentaire de neigedhiver le 09/01/2010 11:40:17

LOL j'avais pas vu la visibilité de la méthode ^^
Hum. Bon. Mais est-ce qu'une exception avec un message d'erreur ne serait pas plus "propre" ? Bon, c'esdt du détail, hein, à ce niveau là ;)

Commentaire de kohntark le 09/01/2010 12:22:36

Salut,

Ben c'est malin de pondre des sources comme celle ci :$, tu viens de ruiner ma journée et de mettre à la poubelle la class singleton que je m'étais arraché les cheveux à rendre un minimum potable (je ne suis pas expert) ... snif :o)

Rien à dire de plus que ce qui l'a déjà été, j'ai juste modifié à la va vite la méthode clone afin qu'elle lève une exception avec un message explicite.

Bravo !!

Cordialement,


Kohntark-

Commentaire de kohntark le 09/01/2010 12:25:47 10/10

Je reposte pour la note qui ne semble pas être passée ...

Commentaire de sallmbaye le 12/01/2010 00:52:37

salut, ban je trouve votre solution assez simpliste mais vous devriez revoir ce syntaxe $instance = new static
dans
#  final static public function getInstance()
# {
# static $instance = null;
# return $instance ?: $instance = new static;
# }

je pense que t'a voulu faire new Singleton

Commentaire de neigedhiver le 12/01/2010 00:59:57

Salut Sallmbaye,

Non, static, en PHP5.3 ne représente pas uniquement un mot clé désignant une méthode statique : il désigne aussi, grâce au LSB (Late State Binding, cf le lien donné par l'auteur de la source) la classe parente appelée de manière statique (dans une méthode statique). static, dans un contexte statique, est l'équivalent de parent dans un contexte objet.
Ce n'était pas possible avant, PHP5.3 apporte ici une réelle nouveauté : static permet de se référer à la classe parente via une méthode statique, ce qui n'était pas possible avant.

La différence est que new Singleton va tenter d'instancier la classe Singleton, qui est abstraite : en résultera une belle erreur fatale.

Commentaire de abdoulax le 26/01/2010 11:07:35

Alors moi je vois un truc simple que j'attend depuis un moment dans PHP, c'est le ?:

Si j'ai bien compris
var_dump($test?:"yo"); // yo
$test = "lol";
var_dump($test?:"yo"); // lol

Commentaire de Waredan le 26/01/2010 12:38:03

C'est exacte, une valeur équivalente à FALSE te fera passer dans la 2ème partie de la condition.

var_dump(false ?: true); // bool(true)
var_dump(null ?: true); // bool(true)
var_dump(0 ?: true); // bool(true)
var_dump('' ?: true); // bool(true)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

templates avec poo [ par lesnes ] bonjours je reprogramme totalement mon site en poo et je souhaiterai utiliser les templates mais l'on ne peut pas faire appel a une class exterieur a [POO] Une classe dans une classe [ par Mrreivax ] Bonsoir.Et bien voila. J'ai créé une classe de gestion des images.J'ai par la suité créé une autre classe de gestion de banières.Mais, cette dernière Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci Pattern [ par charloteuf ] Salut à tous, J'ai un problème de pattern. J'aimerais travailler sur les chaines qui sont entre les balises pour un editeur WYSIWYG. il faut que je ra Include, class et array [ par Hades5k ] Bonjour! J'ai un petit problème à utiliser un array dans un fichier que j'inclus... voici un peu le code : &lt;?php $classNames = array(); include_onc Expression PCRE ... [ par LocalStone ] 'soir ! Voilà, je cherche à parser les attributs d'une balise XML. C'est assez simple, grâce au pattern suivant : $pattern = '/(.+?)=("|\')(.+?)(\\2)/ Problem d'affichage de resultat de requete sous forme de tableau [ par jbcaiz ] explication : je fais un requete de recherche dans ma base, qui doit normalement me sortir plusieur résultat.je veux que ces résultat s'affiche dans u Serveur SMTP [ par Marion0904 ] Bonsoir, J'essai d'nvoyer des mails en utilisant la class phpmailer (disponible sur&nbsp; http://phpmailer.sourceforge.net/). J'incu la class php mail class,PDF,XLS et boucles..... [ par booth ] bonjour!j'ai un méga problème...je dois générer un PDF et une grillle excel toutes deux issues d'un moteur de recherche...pour le moteur de recherche Retouches sur un scripts [ par apz ] salut,ce script php, un guestbook, est le livre d'or que je cherchais.mais voila il se base sur les Class, que je ne connais pas desormais.alors je vo


Nos sponsors


Sondage...

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

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