2010-10-07 6 views
2

J'ai une question simple. J'utilise un singleton qui implémente une classe abstraite. Est-il possible de mettre la méthode getInstance() et la variable $ _instance dans la classe abstraite au lieu de la concrète que je veux créer?singleton en classe abstraite php

Voici mon code:

<?php 
class Command_Log extends Command_Abstract { 
    private static $_instance=null; 

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

    protected function realExecute() { 
    } 

    protected function realSimulate($fileHandle) { 
    } 

} 

et

<?php 

abstract class Command_Abstract implements Command_Interface { 
    protected $_data=array(); 
    //private static $_instance=null; 
    protected $_isExecuted=false; 
    protected $_execute=false; 


    public function enableExecute() { 
     $this->_execute=true; 
     return $this; 
    } 

    protected function __construct() { 

    } 
    protected function __clone() {} 


    public function addData($data) { 

     array_push($this->_data,$data); 
     return $this; 
    } 

    abstract protected function realExecute(); 

    abstract protected function realSimulate($fileHandle); 

    public function execute() { 
     if(!$this->_isExecuted && $this->_execute) { 
      $this->_isExecuted = true; 
      $this->realExecute(); 
     } 
    } 

    public function simulate() { 
     $exitSystem = false; 
     if(!$this->_isExecuted && $this->_execute) { 
      $this->_isExecuted = true; 
       $exitSystem = $this->realSimulate($fh); 
      } 
     } 
     return $exitSystem; 
    } 

} 

J'ai de nombreuses implémentations des commandes, donc je ne veux pas de code redondant partout dans mes mises en œuvre. Est-il possible de mettre ces deux choses dans la classe abstraite, si oui s'il vous plaît dites-moi comment.

Si non s'il vous plaît expliquez-moi pourquoi il n'est pas possbile. Ou si j'ai besoin de changer quelque chose pour le faire, de toute façon.

salutations

Répondre

3

OUI NOUS POUVONS!

J'ai une classe appelée Singleton qui est abstrait ... et de nombreuses classes qui étend cette classe Singleton ... c'est le code:

abstract class Singleton { 

    private static $instances = array(); 

    final private function __construct($_params) { 
     $class = get_called_class(); 
     if (array_key_exists($class, self::$instances)) 
      throw new Exception('An instance of '. $class .' already exists !'); 

     //static::initialize(); //In PHP 5.3 
     $this->initialize($_params); 
    } 
    final private function __clone() { } 

    abstract protected function initialize(); 

    public static function getInstance($_params=array()) { 
     $class = get_called_class(); 
     if (array_key_exists($class, self::$instances) === false){ 
      self::$instances[$class] = new $class($_params); 
     } 
     return self::$instances[$class]; 
    } 
} 

et (par exemple) la DBConnection de classe qui va de Singleton

class DBConnection extends Singleton{ 

    private $connexion_pdo=null; 

    protected function initialize(){ 
      //connect to the DB 
     $this->connexion_pdo = blablalba; 
    } 
} 

bien qu'il y ait des problèmes dans PHP 5.2 .. surtout avec la fonction get_called_class() et la static::initialize()

Vous pouvez aussi vérifier les php site for patterns ... il y a beaucoup de contributions pour le singleton

Bonne chance

+1

+1, bien que quand vous dites « il y a des problèmes en php 5.2 », ce que vous entendez est ce » est impossible en PHP 5.2 "! La nouvelle fonctionnalité, pour ceux qui ne le savent pas, est [late static binding] (http://php.net/manual/fr/language.oop5.late-static-bindings.php) et sera très utile dans tous façons de rendre le support de la POO de PHP beaucoup plus flexible. – lonesomeday

+0

effectivement le code est fait pour 5.2 .. j'ai utilisé une fonction qui simule la fonction get_called_class() http://www.septuro.com/2009/07/php-5-2-late-static-binding-get_called_class-and -self-new-self/et au lieu d'utiliser la liaison statique avec self :: initialize j'utilise $ this-> initialize (c'est pourquoi j'ai commenté cette ligne sur la classe Singleton) Je ne suis pas vraiment sûr de faire ça mais cela fonctionne pour 5.2 =) – pleasedontbelong

+0

bien, merci beaucoup, je suis condamné à utiliser 5.2 J'ai utilisé 5.3 featuers déjà comme $ var :: call_method() et je dois le replier sur call_user_func (array ($ var, "call_method ")) comme je me suis rendu compte que j'ai besoin de support pour 5.2. Je vais jeter un oeil si vraiment wann faire cela pour 5.2 avec votre solution. Ne vous méprenez pas, c'est beau, mais peut-être pas la façon dont je veux marcher. :) – evildead