gpt4 book ai didi

php - 抽象类php中的单例

转载 作者:行者123 更新时间:2023-12-04 06:44:16 26 4
gpt4 key购买 nike

我有一个简单的问题。我使用一个实现抽象类的单例。是否可以将 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;
}

}

我有很多命令的实现,所以我不希望在我的实现中到处都是冗余代码。是否可以将这两个东西放在抽象类中,如果是,请告诉我如何。

如果不是,请向我解释为什么它不是 possbile。或者如果我需要改变一些东西来做到这一点,无论如何。

问候

最佳答案

我们可以!

我有一个名为 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 ...单例有很多贡献

祝你好运

关于php - 抽象类php中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3885464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com