2011-10-28 16 views
2

我總是困惑於哪種方式是最好做以下事情。例如,假設我們有兩個類BlogPostTag,它們對應於數據庫表PostsTags。在另一個類中實例化一個類還是應該是獨立的?在另一個類中實例化類是不好的設計嗎?

class BlogPost { 
     private $db; 
     private $title; 
     private $description; 
     private $tagsArray; 

     public function __construct($db){$this->db = $db;} 
     public function getTitle(){/*...*/} 
     public function getDescription(){/*...*/} 
     public function getTags(){/*...*/} 
     public function setTitle($title){/*...*/} 
     public function setDescription($desc){/*...*/} 
     public function setTags($tags){/*...*/} 
     public function addPost(){ 
      //insert into database query 
      //bindParams 
      //execute 

      $this->addTags($this->db->last_insert_id()); 
     } 
     public function addTags($lastInsertId){    
      require_once('class.Tag.php'); 

      foreach($tagsArray as $tagItem){ 
       $tagClass = new Tag($this->db, $lastInsertId); 
       $tagClass->setTagName($tagItem["title"]); 
       $tagClass->addTag(); 
      } 
     } 
    } 

的index.php

require_once('class.BlogPost.php'); 
    $blogPost = new BlogPost($db); 
    $blogPost->setTitle("title"); 
    $blogPost->setDescription("description"); 
    $blogPost->setTags($tagsArray); 
    $blogPost->addPost(); 

或者是更好地保持獨立的班?像這樣:

class BlogPost { 
    private $db; 
    private $title; 
    private $description; 

    public function __construct($db){$this->db = $db;} 
    public function getTitle(){/*...*/} 
    public function getDescription(){/*...*/} 
    public function getId(){/*...*/} 
    public function setTitle($title){/*...*/} 
    public function setDescription($desc){/*...*/} 
    public function setId($id){/*...*/} 
    public function addPost(){ 
     //insert into database query 
     //bindParams 
     //execute 

     $this->setId($this->db->last_insert_id()); 
    } 
} 

的index.php

require_once('class.BlogPost.php'); 
$blogPost = new BlogPost($db); 
$blogPost->setTitle("title"); 
$blogPost->setDescription("description"); 
$blogPost->addPost(); 

$lastInsertId = $blogPost->getId(); 

require_once('class.Tag.php'); 
$tagClass = new Tag($db, $lastInsertId); 
$tag->setTags($tagsArray); 
$tag->addTag(); 

感謝您的信息!

回答

1

這當然不是壞的設計。面向對象中沒有什麼說「你不應該這樣做」。當然,減少依賴關係是一個目標,但在執行操作時首先要創建Tag s的目的不會對Tag類產生不必要的依賴關係。

由於Tag對象由於數據庫關係而依賴於BlogPost,因此使用BlogPost方法創建它們是完全有意義的。通過把代碼拿出來,你只能「獲得」必須在每次手動編寫代碼的特權(並且可能會弄錯)。

+0

**它肯定是,現在仍然是,糟糕的設計** .. – Jimbo

+0

@Jimbo:'addTags'內創建的實例不會泄漏到外部甚至更多,如果仔細閱讀代碼,您會看到「addTags」本身甚至不應該首先公開。你認爲什麼是不好的設計,爲什麼? – Jon

+0

也許我們應該編輯你的答案來澄清?我相信你對OP的問題的迴應:*在另一個類中實例化一個類是否糟糕?*是:「這當然不是壞設計」。大聲笑! – Jimbo

2

依賴注入在PHP世界中正在獲得大量的熱量,這將讓你在外部實例化依賴對象並傳遞給構造函數或setter。這對於單元測試非常有用,並且如果您的依賴對象發生變化,則允許靈活性。更好的辦法是傳遞一個接口,所以如果你改變了一些東西,說你的數據庫,那麼就不需要改變應用程序代碼,只需要改變基本的數據庫類或工廠。

+1

我剛剛讀過帕特里克的評論,我完全同意。傳遞實現「ITag」的類將更加靈活,讓您可以選擇「簡單」和「高級」標籤(僅僅是一個理論示例)。 –

+0

這是一個明顯的答案。 – Jimbo

0

在我看來,我會創建一個「標籤」工廠類,可以一次或一次生成「標籤」,然後一旦您將所有「標籤」添加到「 BlogPost「,將該數組傳遞給」BlogPost「類。

它只是一個更清潔的設計,國際海事組織。

-1

您應該避免使用require/include作爲類。使用一個Class Loader

+0

這不是對這個問題的回答,相反,它應該是一個評論。 –

相關問題