簡體   English   中英

PHP OOP類vs函數與靜態函數效率

[英]PHP OOP Class vs Functions vs Static Functions efficiency

對不起,如果我沒有使用最好的行話,但我遇到了一個問題,我想在我編寫太多代碼之前提前解決。 以下哪個選項“更好”? 還有更好的方法嗎? 有人提到我抽象我的代碼,但另一個類似乎是我需要的最后一件事。 另外我覺得我可以通過將下面的“獲取”功能看到公共靜態函數來做我可以做的事情,這樣我就可以用不同的方式。 (現在不是靜態的)

這是我的情況:

  • 我有2個(與此問題相關)類,DB(數據庫)和頁面(用於獲取我的內容以顯示在我的網站上)
  • DB類有一個准備和執行我的查詢的查詢方法
  • DB類還具有從數據庫中插入,獲取,刪除內容的方法。
  • 我現在覺得我可能甚至不需要我的頁面類,因為在網頁上我可以使用這些數據庫方法來調用我的內容。 (我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM