Poo - singleton class

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 288 fois - Téléchargée 16 fois

Contenu du snippet

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 / Exemple :


<?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.
* 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.
* *
  • @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; ?>

A voir également

Ajouter un commentaire

Commentaires

Waredan
Messages postés
22
Date d'inscription
vendredi 8 janvier 2010
Statut
Membre
Dernière intervention
19 février 2010

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)
abdoulax
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012

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
neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
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.
sallmbaye
Messages postés
1
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
12 janvier 2010

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
kohntark
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
22
Je reposte pour la note qui ne semble pas être passée ...

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.