2010-10-07 51 views
2

我有一個簡單的問題。我使用一個實現抽象類的單例。是否有可能把getInstance()方法和變量$ _instance放在抽象類中,而不是我想創建的具體的類?抽象類中的單例php

這裏是我的代碼:

<?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) { 
    } 

} 

<?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; 
    } 

} 

我有命令的許多實現,所以我不想重複代碼無處不在我的實現。是否有可能把這兩樣東西放在抽象類中,如果是的話請告訴我如何。

如果不是,請向我解釋爲什麼它不是possbile。或者,如果我需要改變一些事情來做到這一點,無論如何。

關於

回答

3

是的,我們可以!

我有一個名爲Singleton類就是抽象......和許多類,擴展了Singleton類......這是代碼:

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]; 
    } 
} 

和(例如)類DBConnection的,從延伸辛格爾頓

class DBConnection extends Singleton{ 

    private $connexion_pdo=null; 

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

雖然在PHP 5.2的一些問題..特別是與功能get_called_class()static::initialize()

您也可以檢查php site for patterns ......有很多的單例

好運

+1

+1,貢獻雖然當你說「也有在PHP 5.2的一些問題」,你的意思是「這在PHP 5.2中是不可能的!「!對於任何不知道的人來說,新功能是[後期靜態綁定](http://php.net/manual/en/language.oop5.late-static-bindings.php),並且在所有各種使PHP的OOP支持更加靈活的方法。 – lonesomeday 2010-10-07 20:34:15

+0

實際上代碼是爲5.2製作的。我使用了一個函數來模擬函數get_called_class()http://www.septuro.com/2009/07/php-5-2-late-static-binding-get_called_class-and - self-new-self /而不是使用self :: initialize的靜態綁定我使用$ this-> initialize(這就是爲什麼我在Singleton類中評論該行)我不確定這樣做是否正確,但它適用於5.2 =) – pleasedontbelong 2010-10-07 20:43:19

+0

很好,非常感謝,我註定要使用5.2我已經使用了一些5.3特性,如$ var :: call_method(),並且必須將它返回給call_user_func(array($ var,「call_method 「)),因爲我意識到我需要5.2的支持。我會看看是否真的想爲你的解決方案做5.2。不要誤會我的意思,它的美麗,但可能不是我想要走路的方式。 :) – evildead 2010-10-07 21:08:09