[英]PHP OOP Class vs Functions vs Static Functions efficiency
對不起,如果我沒有使用最好的行話,但我遇到了一個問題,我想在我編寫太多代碼之前提前解決。 以下哪個選項“更好”? 還有更好的方法嗎? 有人提到我抽象我的代碼,但另一個類似乎是我需要的最后一件事。 另外我覺得我可以通過將下面的“獲取”功能看到公共靜態函數來做我可以做的事情,這樣我就可以用不同的方式。 (現在不是靜態的)
這是我的情況:
我現在覺得我可能甚至不需要我的頁面類,因為在網頁上我可以使用這些數據庫方法來調用我的內容。 (我在mysql中存儲所有圖像,內容,頁面標題,描述)。 這不是一種合法的方式嗎? 我不是每次都需要創建一個新對象嗎? 如:
$pg_ID = 2; $title = new DB($pgID); $title->get('pages', $pgID, $lang); // 3 tables to pull from for each page $images = new DB($pgID); $images->get('images', $pgID, $lang); $structure = new DB($pgID); // I need these tables mostly because my site is in two languages $images->get('pages_list', $pgID);
我不喜歡這種潛在的解決方案,因為對我來說它的反直覺。 為什么我必須創建新對象只是為了重用一個函數? 但是,我現在做的是我覺得會給我一些討厭的郵件。
$page = new Page();
$page->find('pages', $pgID, $lang);
$page->lookup($pgID);
$page->retrieve('images', $pgID, $lang);
這些是我的Page類中的3個獨立函數,它們執行非常相似的操作。 查找從數據庫中獲取我的頁面內容並將其作為對象返回。 Lookup基本上做同樣的事情,但只需傳遞一個變量,因為它只與每個頁面的html結構有關,無論訪問哪種語言。 retrieve從表中獲取所有圖像,這些圖像顯示在具有不同語言描述的滑塊中。 但正如你所看到的,這三個功能基本上都是一樣的! 他們查詢數據庫。 感謝您的幫助,我真的只是進入這個OOP,它讓我瘋了。 Stack非常有幫助,我想我只是不知道如何搜索這個以找到答案。 請隨意指出我可能錯過的其他問題/答案。 我很難想到要搜索的關鍵字。
我不想針對您的情況進入針對SPECIFIC實施的雜草,而是我將提供一些通用指導。
首先,您不必為標題,圖像或結構創建單獨的數據庫對象(dbo)。 有可能你正在初始化的每個dbo使用的DSN完全相同,所以我會創建一個可以在多個對象之間共享的單例dbo。 有關參考,請查看Doctrine的連接管理器 。
其次,我認為你的客觀化可以更好地實施。 在大多數ORMS實現之后,您有一個Record類和一個Table類。 Record類是模式中Record的特定實例,而Table類對您的商店執行查詢,這可能會導致多個記錄。 然后將這些結果水合成陣列(記錄)。
所以我建議的是這樣的事情(代碼尚未經過測試,其中一些代碼為簡潔起見):
class PageTable
{
public static function getById($id)
{
// Validate id, if invalid throw exception
$dbo = Database::getConnection();
$stmt = $dbo->prepare('SELECT * FROM page WHERE id = :id');
$stmt->bindParam(array('id' => $id));
$stmt->execute();
$result = $stmt->fetch();
$page = new Page;
// Hydration
$page->setId($result['id']);
$page->setImages($result['images']);
return $page;
}
}
class Page
{
protected $id;
protected $title;
public function setId($id){}
public function getId(){}
}
希望記錄和方法的這種分離能夠影響單個或多個記錄。 你應該看一下DBAL,比如Doctrine 。
我們確實可以創建其他類,但效率很高。 也許我們可以將DB渲染為公共狀態函數。 我喜歡創建數據庫對象的想法,將其作為參數傳遞給另一個對象,然后可以使用剛剛收到的鏈接格式化數據:
$pg_ID = 2;
$db = new DB($pg_id);
$page = new Page($db,$pg_ID);
// make sure you assign the parameters a private properties in `Page()` ctor.
然后,從你的函數里面,你可以調用圖片,標題和結構隨意從$this
$title = $this->DB->get('pages', $this->pgID, $lang);
$images = $this->DB->get('images', $this->pgID, $lang);
$structure = $this->DB->get('pages_list', $this->pgID);
而你也可以使用其他方法
$page->find('pages', $this->pgID, $lang);
$page->lookup($this->pgID);
$page->retrieve('images', $this->pgID, $lang);
現在,每當我們需要來自數據庫的信息時,我們就不需要創建新對象。
現在...
我在這里訪問成員函數的方式$this->pgID
最好通過定義一個getter來使用: $this->pgID()
。 我喜歡我的吸氣劑與酒店的名稱相同。 但這可能不是一個好主意。
private function pgID() {
return $this->pgID;
}
至於抽象類......
事實上我最近確實認為抽象類確實非常酷。 我在措辭方面遇到了一些問題,有一個帶有自定義強制函數的常量構造函數,並且可能有不同的類實現看起來很棒:
abstract class Page {
function __construct($db,$pgID,$lang,$params='') {
$this->db = $db;
$this->pgID = $pgID;
$this->lang = $lang;
$this->init($params);
}
function pgID() {
return $this->pgID;
}
function lang() {
return $this->lang;
}
abstract function init();
abstract function retrieve();
}
class Structure extends Page {
function init($params) {
// some specific to Structure foo here
}
function retrieve($what='pages_list') {
return $this->db->get($what,$this->pgID,$this->lang);
}
}
class Image extends Page {
function init($params) {
// some specific to Image foo here
}
function retrieve($what='images') {
$images = $this->db->get($what,$this->pgID,$this->lang);
// plus some foo to resize each images
return $images;
}
}
好的,希望你還在那里! 現在我們有一個Structure和Image類,其中包含必需構造函數參數,泛型函數和自定義檢索函數。 我們可以這樣使用它們:
$db = new DB(2);
$template = new Structure($db,2,'fr');
$template->retrieve();
$slideshow = new Image($db,4,'en');
$slideshow->retrieve();
如果您使用不同的頁面ID,我希望您不必創建新的DB
實例:-)
笑話appart這有助於我以更好的結構化方式使用類,因為我可能有許多不同的類來表示站點的不同部分,但是當從索引調用時,所有這些類都將具有相同的函數名稱,如retrieve()
或print()
, list()
......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.