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。或者,如果我需要改變一些事情來做到這一點,無論如何。
關於
+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
實際上代碼是爲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
很好,非常感謝,我註定要使用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