2012-01-21 1 views
1

Je suis en train d'atteindre l'objectif suivant:Résumé Singleton classe modèle

En utilisant cette classe générale singleton:

abstract class Singleton { 

    private static $instance = null; 

    public static function self() 
    { 
     if(self::$instance == null) 
     { 
     $c = __CLASS__; 
     self::$instance = new $c; 
     } 

     return self::$instance; 
    } 
} 

J'aimerais être en mesure de créer Singleton classe concrète tels que:

class Registry extends Singleton { 
    private function __construct() {} 
    ... 
} 

puis les utiliser comme:

Registry::self()->myAwesomePonyRelatedMethod(); 

Mais inconsciemment __CLASS__ est prévu comme Singleton donc une erreur fatale se produit à propos de PHP ne pouvant pas instancier une classe abstraite. Mais la vérité est que je veux que le registre (par exemple) soit instancié.

J'ai donc essayé avec get_class($this) mais étant une classe statique, Singleton n'a pas $ this.

Que pouvais-je faire pour le faire fonctionner?

+0

Quelle version de PHP vous utilisez? –

+0

@Phoenix 5.3.0+ – Shoe

+4

[Les singlesons sont mauvais] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) –

Répondre

5

Code de mes diapositives Abridged Singletons in PHP - Why they are bad and how you can eliminate them from your applications:

abstract class Singleton 
{ 
    public static function getInstance() 
    { 
     return isset(static::$instance) 
      ? static::$instance 
      : static::$instance = new static(); 
    } 

    final private function __construct() 
    { 
     static::init(); 
    } 

    final public function __clone() { 
     throw new Exception('Not Allowed'); 
    } 

    final public function __wakeup() { 
     throw new Exception('Not Allowed'); 
    } 

    protected function init() 
    {} 
} 

Ensuite, vous pouvez faire

class A extends Singleton 
{ 
    protected static $instance; 
} 

Si vous devez faire override logique de configuration supplémentaire init dans la classe extension.

Voir aussi Is there a use-case for singletons with database access in PHP?

+1

+1 Pour la mention des diapositives :) – Pelshoff

+2

@Gordon, vous venez de détruire mon idée de projet. C'est cruel! J'ai aimé Singleton avant, et maintenant je lis toutes ces mauvaises choses à leur sujet :(Donc, fondamentalement, pour les éviter, je devrais utiliser le modèle d'injection de dépendance? – Shoe

+1

@JeffPigarelli Je dirais désolé si je ne considère pas cela comme un gain majeur;) Oui. L'injection de dépendance est la voie à suivre. Et la séparation des graphes de créateur et des graphiques de collaborateur. Voir http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/ – Gordon