我知道单身汉不好。但这也不好吗?

class DaoMySQL {

    private static $instance;
    private $PDO;

    private function __construct() {
        $this->PDO = new PDO('mysql:dbname='.MYSQL_DEFAULT_DATABASE.';host='.MYSQL_HOSTNAME, MYSQL_USERNAME, MYSQL_PASSWORD);
        $this->PDO->query('SET NAMES \'utf8\'');
    }

    /**
     * @return DaoMySQL
     */
    static public function singleton() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c();
        }
        return self::$instance;
    }

    /**
     * @return PDO
     */
    public function getPDO() {
        return $this->PDO;
    }

}

为了使用这个,我做了这样的事情。(这是来自所有数据对象扩展的bean类。)
public function delete() {
    $calledClassName = get_called_class();
    $query = "DELETE FROM `" . $calledClassName::table . "` WHERE `id` = $this->id";
    return DaoMySQL::singleton()->getPDO()->exec($query);
}

最佳答案

许多人开始使用依赖注入容器来管理他们的对象,而不是使用单例。也许值得一看?那么您只需要确保对象可以访问容器。你可以从那里拿其他的东西。
我个人使用symfony组件中的sfServiceContainer。这是一个独立的di容器,现在似乎很流行。
更新
不需要使用框架或库。fabien potensier的articles on dependency injection应该能让您充分掌握di,从而实现自己的di。但为什么要重新发明轮子呢?不使用一个好的,现有的库闻起来有NIH的味道。
注意,除了我使用的sfservicecontainer之外,还有许多其他的di库。还要注意,sfservicecontainer是一个完全独立的库。它不需要symfony或任何其他框架。它只需要简单的旧php。

关于php - PHP:将数据库层实现为单例可接受吗?代码里面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5036391/

10-11 05:24
查看更多