在另一个类中实例化一个类是不好的设计?

时间:2011-10-28 14:50:11

标签: php oop

我总是很困惑,哪种方式最好做以下事情。例如,假设我们有两个类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();

感谢您的任何信息!

4 个答案:

答案 0 :(得分:2)

依赖注入现在在PHP世界中获得了很多动力,这将使您在外部实例化依赖对象并传入构造函数或setter。这对于单元测试非常有用,并且如果您的依赖对象要更改,则允许灵活性。更好的方法是传递一个接口,所以如果你改变了一些东西,比如你的数据库,就不需要改变应用程序代码,只需更改基础数据库类或工厂。

答案 1 :(得分:1)

设计肯定不错。 OO中没有任何内容表示“你不应该这样做”。当然,减少依赖性是一个目标,但是当您执行以首先创建Tag s为目标的操作时,Tag类不会有不必要的依赖。

由于Tag对象由于数据库关系而依赖于BlogPost,因此使用BlogPost方法创建它们是完全合理的。通过取出代码,您只能“获得”每次必须手动编写代码的权限(并且可能会出错)。

答案 2 :(得分:0)

在我看来,我会创建一个“标签”工厂类来生成“标签”,一次一个或一次生成,然后一旦你有你想要附加到“BlogPost”的所有“标签” “,将该数组传递给”BlogPost“类。

它只是为了更清洁的设计,IMO。

答案 3 :(得分:-1)

您应该避免对类使用require / include。使用Class Loader