我总是很困惑,哪种方式最好做以下事情。例如,假设我们有两个类BlogPost
和Tag
,它们对应于数据库表Posts
和Tags
。在另一个类中实例化一个类或者它们是否应该独立是不好的设计?
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();
感谢您的任何信息!
答案 0 :(得分:2)
依赖注入现在在PHP世界中获得了很多动力,这将使您在外部实例化依赖对象并传入构造函数或setter。这对于单元测试非常有用,并且如果您的依赖对象要更改,则允许灵活性。更好的方法是传递一个接口,所以如果你改变了一些东西,比如你的数据库,就不需要改变应用程序代码,只需更改基础数据库类或工厂。
答案 1 :(得分:1)
设计肯定不错。 OO中没有任何内容表示“你不应该这样做”。当然,减少依赖性是一个目标,但是当您执行以首先创建Tag
s为目标的操作时,Tag
类不会有不必要的依赖。
由于Tag
对象由于数据库关系而依赖于BlogPost
,因此使用BlogPost
方法创建它们是完全合理的。通过取出代码,您只能“获得”每次必须手动编写代码的权限(并且可能会出错)。
答案 2 :(得分:0)
在我看来,我会创建一个“标签”工厂类来生成“标签”,一次一个或一次生成,然后一旦你有你想要附加到“BlogPost”的所有“标签” “,将该数组传递给”BlogPost“类。
它只是为了更清洁的设计,IMO。
答案 3 :(得分:-1)
您应该避免对类使用require / include。使用Class Loader