我有一个简单的问题。我使用一个实现抽象类的单例。是否可以将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;
}
}
我有很多命令的实现,所以我不想在我的实现中到处都是冗余代码。是否可以将这两件事放在抽象类中,如果是,请告诉我如何。
如果没有,请向我解释为什么它不可能。或者,如果我需要改变一些事情,无论如何。
问候
答案 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
扩展的类DBConnectionclass 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 ...单身人士有很多贡献
祝你好运