将Database类传递给构造函数?

时间:2011-03-16 00:54:06

标签: php mysql

什么是更好的做法?要传递数据库还是打开数据库?当我将数据库传递给构造函数时,我无法执行自动完成(NetBeans PHP IDE)。

class Item {
    private $name;
    private $database;

    public function __construct($database, $id) {
        $information = $database->fetchSingleRow($id);

        $this->database = $database;
        $this->name = $information['name'];
    }
}

我应该这样做吗

class Item {
    private $name;
    private $database;

    public function __construct($id) {
        $this->database = new Database();
        $this->database->open();
        $this->database->select('test'); // selects test table

        $information = $this->$database->fetchSingleRow($id);
        $this->name = $information['name'];
    }

    public function __destruct() {
        unset($this->item);
        $this->database->close();
    }
}

3 个答案:

答案 0 :(得分:1)

有几件事:

  1. DB对象通常更适合通过factory / singelton / registery获取而不是移动它。除非您能够在一个请求中保留数千个打开的连接。
  2. 如果您想要自动完成 - 在函数声明中添加类型提示
  3. public function toto(DataBaseClass $MyDB,array $params){...}
    

答案 1 :(得分:1)

我个人将它作为构造函数中的参数传递。如果您有许多Item实例,则每次都会创建一个新连接,这会使您的数据库感到紧张。

答案 2 :(得分:0)

已经涵盖了每次你攻击一个项目时创建一个新的数据库实例将成为数据库的压力,但我还想指出它确实不是一个好的设计决策。

这里的主要问题是你没有遵循设计的“原则”。如果您要让Item创建一个新的Database对象,那么如果您想要更改有关如何创建/打开数据库等的任何内容,您将遇到问题。您必须在创建新数据库实例的代码库中的任何位置进行更改。因此,没有做好改变的准备。