UPDATE:改寫一個問題,在這個類結構中是否存在太多靜態方法(我意識到現在只有4個,但我最初是以2開始的)?如果是這樣,有關如何重構這些類來使用某種Finder類的建議,以便我可以從Model類中移除靜態函數?對於一個類,有多少個靜態方法太多?
我有以下抽象類:
abstract class LP_Model_Abstract
{
protected static $_collectionClass = 'LP_Model_Collection';
protected $_row = null;
protected $_data = array();
public function __construct($row = null)
{
$this->_row = $row;
}
public function __get($key)
{
if(method_exists($this, '_get' . ucfirst($key)))
{
$method = '_get' . ucfirst($key);
return $this->$method();
}
elseif(isset($this->_row->$key))
{
return $this->_row->$key;
}
else
{
foreach($this->_data as $gateway)
{
if(isset($gateway->$key))
{
return $gateway->$key;
}
}
}
}
public function __set($key, $val)
{
if(method_exists($this, '_set' . ucfirst($key)))
{
$method = '_set' . ucfirst($key);
return $this->$method($val);
}
elseif(isset($this->_row->$key))
{
$this->_row->$key = $val;
return $this->_row->$key;
}
else
{
foreach($this->_data as $gateway)
{
if(isset($this->_data[$gateway]->$key))
{
$this->_data[$gateway]->$key = $val;
return $this->_data[$gateway]->$key;
}
}
}
}
public function __isset($key)
{
return isset($this->_row->$key);
}
public function save()
{
$this->_row->save();
}
abstract public static function get($params);
abstract public static function getCollection($params = null);
abstract public static function create($params);
}
然後這個類,它提供對類表繼承方案的附加功能(其中,類型是重要的,在工廠的方式確定的附加功能) :
abstract class LP_Model_Factory_Abstract extends LP_Model_Abstract
{
protected static $_collectionClass = 'LP_Model_Collection_Factory';
abstract public static function factory($row);
}
這些最終導致以下類型的聲明:
class Model_Artifact extends LP_Model_Factory_Abstract
{
protected static $_artifactGateway = 'Model_Table_Artifact';
public static function create($params)
{
}
public static function get($params)
{
$gateway = new self::$_artifactGateway();
$row = $gateway->fetchArtifact($params);
return self::factory($row);
}
public static function getCollection($params = null)
{
$gateway = new self::$_artifactGateway();
$rowset = $gateway->fetchArtifacts($params);
$data = array(
'data' => $rowset,
'modelClass' => __CLASS__
);
return new self::$_collectionClass($data);
}
public static function factory($row)
{
$class = 'Model_Artifact_' . $row->fileType;
}
}
你什麼時候知道你在一個類中有太多的靜態方法?你將如何重構現有的設計,以便靜態方法可能封裝在某種Finder類中?
微軟笑話的提醒,技術上正確,但在這種情況下,不是非常有用。主要是因爲這些方法已經不能修改對象的狀態,他們只是返回對象或創建一個全新的對象。但無論如何thx答案。 ;-) – 2009-01-14 22:06:13
夠公平的。我不熟悉php使用過去的概念信息在這種情況下=( – 2009-01-14 22:12:18
gabriel,你問「什麼時候太多?」不看我的代碼是這麼多... – cgreeno 2009-01-14 22:14:52