代码之家  ›  专栏  ›  技术社区  ›  evildead

抽象类php中的singleton

  •  2
  • evildead  · 技术社区  · 15 年前

    我有一个简单的问题。我使用实现抽象类的单例。是否可以将getInstance()方法和变量$\u实例放在抽象类中,而不是我要创建的具体类中?

    以下是我的代码:

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

    我有许多命令的实现,所以我不希望在我的实现中到处都有冗余代码。可以把这两个东西放到抽象类中吗?如果可以,请告诉我怎么做。

    如果没有,请向我解释一下为什么不可能。或者如果我需要做些改变,无论如何。

    当做

    1 回复  |  直到 9 年前
        1
  •  3
  •   AlbinoDrought 030    9 年前

    是的,我们可以!

    我有一个叫做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];
        }
    }
    

    以及(例如)从singleton扩展的类dbconnection

    class DBConnection extends Singleton{
    
        private $connexion_pdo=null;
    
        protected function initialize(){
                 //connect to the DB
            $this->connexion_pdo = blablalba;
        }
    }
    

    尽管php5.2中有一些问题。特别是功能 get_called_class() 以及 static::initialize()

    你也可以检查 php site for patterns …单身汉有很多贡献

    祝你好运

    推荐文章