2010-08-19 9 views
4

Je veux définir un type de base Singleton à partir de laquelle l'utilisateur tirera ses classes, donc ce que je pensais:est-il possible de définir une interface Singleton en PHP?


interface SingletonInterface { 
    public static function getInstance(); 
} 

abstract class SingletonAbstract implements SingletonInterface { 
    abstract protected function __construct(); 
    final private function __clone() {} 
} 

Mais en utilisant cette aproche l'utilisateur peut mettre en œuvre cette singleton ...


class BadImpl implements SingletonInterface { 
    public static function getInstance() { 
     return new self; 
    } 
} 

Quelle serait votre approche?

+0

* (apparenté) * [Quel est le problème de Singletons] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) – Gordon

Répondre

2

J'utilise ce code pour la création d'un Singleton:

abstract class Singleton { 

    private static $_aInstance = array(); 


    private function __construct() {} 

    public static function getInstance() { 

     $sClassName = get_called_class(); 

     if(!isset(self::$_aInstance[ $sClassName ])) { 

      self::$_aInstance[ $sClassName ] = new $sClassName(); 
     } 
     $oInstance = self::$_aInstance[ $sClassName ]; 

     return $oInstance; 
    } 

    final private function __clone() {} 
} 

Ce utilise de ce modèle:

class Example extends Singleton { 
    ... 
} 

$oExample1 = Example::getInstance(); 
$oExample2 = Example::getInstance(); 

if(is_a($oExample1, 'Example') && $oExample1 === $oExample2){ 

    echo 'Same'; 

} else { 

    echo 'Different'; 
} 
+0

J'ai pensé à cette approche, mais a quelques inconvénients .. 1. PHP 5.3 est nécessaire 2. les actes de classe vous en tant que SingletonContainer 3. les classes dérivées sont considérés comme différents 4. vous appelez le constructeur Mais il a l'avantage que vous avez juste besoin de étendre cette classe pour avoir un Singleton – eridal

3

PHP Rappelez ne permet pas l'héritage multiple vous devez donc choisir avec soin ce que vous basez vos cours sur. Singleton est si facile à implémenter qu'il vaut mieux laisser chaque classe le définir. Méfiez-vous également que les champs privés ne sont pas portés aux classes descendantes et que vous pouvez donc avoir deux champs différents avec le même nom.

0

Tout d'abord: si vous avez tant singletons sur le projet alors vous avez probablement gâcher quelque chose sur le niveau de projection

Deuxième de tous: Singleton devrait être utilisé là, et seulement là, où plus d'une instance de une classe totalement fait aucun sens ou peut causer des erreurs

Enfin: l'héritage ne vise pas à réduire la quantité de code

0

vous pouvez maintenant utiliser les traits, mais avez-vous besoin tant singletons?