单例在抽象类php

时间:2010-10-07 20:05:44

标签: php design-patterns

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

这是我的代码:

<?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 个答案:

答案 0 :(得分: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];
    }
}

和(例如)从Singleton

扩展的类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 ...单身人士有很多贡献

祝你好运