這是一個通用的場景。我有「任務」,我有「任務事件」。我爲每個表創建了一個數據庫表。我還創建了一個處理從數據庫獲取記錄的模型。什麼是確保通用搜索查詢中正確的子類的策略?
對於「任務事件」,我有幾種類型:創建,接受,評論,關閉。
目前,我做了一些簡單的事情,如$task = new Task($task_id);
從數據庫中抓取任務,$task_events = new Tasks_Events($task_id);
抓取該任務的事件。然後,我已經實現了Iterator,所以我可以做foreach($task_events as $e) { ... }
,這一切都很好。
但是,我發現我需要一些專門的處理程序來處理一些事件類型。例如,我創建了Tasks_Events_Comments,它擴展了Tasks_Events,併爲Comment事件類型做了一些額外的處理。我現在意識到,當我收集事件的集合時,我真的需要它們是子類型,所以如果在事件上調用某個方法,就會調用子類型的正確覆蓋。
這裏有一個簡單的例子:
class Model {
public function __construct($search = null) {
// Hypothetical example, basically query the DB and populate data.
if (!is_null($search)) { $this->search($search); }
}
protected function onAfterUpdate() { }
}
class Tasks_Events extends Model {
protected function onAfterUpdate() { /* Task Event Specific */ }
}
class Tasks_Events_Comments extends Tasks_Events {
protected function onAfterUpdate() { /* Task Event Comment Specific */ }
}
然後,假設用例:
class Controller {
public function updateEvent($task_id, $event_id, $params) {
$task = new Tasks($task_id);
$task_event = new Tasks_Events($event_id);
// Some Analysis of Params
$task_event->status = $new_status;
$task_event->save();
}
}
所以,這裏是關鍵。這樣做,這樣會調用Tasks_Events onAfterUpdate()...
我的問題是,什麼是模型,模式,理念,方法,我可以使用,這樣,當我有任務的活動的集合,和我行動之一,即使我使用的是基類引用,我需要調用子類的函數。
我真的很喜歡的$e = new Tasks_Events(3); $e->status = 4; $e->save();
一個解決方案,我有我不喜歡簡單,就是要像做$e = Tasks_Events::Get($id);
其中Tasks_Events會查詢數據庫,確定類型,然後做一個「開關」,創建正確的類型被退回。
我不喜歡這個的另一個原因是因爲我已經構建了模型來執行像$tasks = new Tasks(array('user_id' => 5, 'status' => Tasks::STATUS_OPEN));
這樣酷的事情,它將構建適當的數據庫查詢並填充用戶5的所有打開的任務。那麼我可以做foreach($tasks as $t) { echo $t->subject; }
等。所以,我很想能夠保持這種類型的系統....但我不知道如果我可以,如果我想利用繼承的子類型的優勢。
恐怕我可能需要一個工廠模式,但我希望我可能只是失去了一些東西。
P.S.如果你能想到更好的標題,請隨時改變它。
當你爲一個類調用一個構造函數時,你總是會得到該類的一個實例。沒有辦法繞過它,你需要某種工廠方法。是否有一個原因,你不能只執行'$任務 - > getEvents()'? –