PHP:在singleton类中使用MySQL连接

时间:2014-10-07 14:08:59

标签: php mysql pdo

我有一个PHP Web服务,它使用单例API类来调用我的Web服务方法。我的应用程序中的每个模块都有特定的类:帖子,用户,登录等。我的API类是这样的:

class API{

    private static $api;
    private $database;
    private $post;
    private $user;

    public function __construct(){
        $this->database = new DataBase();
        $this->post = new Post();
        $this->user = new User();
    }

    public static function getInstance(){
        if(empty(self::$api)){
            self::$api = new API();
        }
        return self::$api;
    }
}

因此,要获取我的用户帖子,我会在API类中调用$api->post->getPosts(),或在API类之外调用API::getPosts()。 API类是一个外观。每个子类都有自己的DataBase实例。例如,PostUser具有以下内容:

class User{
    private $database;

    public function __construct(){
        $this->database = new DataBase();
    }
}

我的DataBase构造函数类似于:

public function __construct() {
    try{
        $this->db = new \PDO(
                "mysql:host=$this->host;dbname=$this->base;",
                $this->user, $this->pass, 
                array(\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")
        );
    }catch(\PDOException $e){
        echo "<b>Error:</b> {$e->getMessage()} in <b>{$e->getFile()}</b> on line <b>{$e->getLine()}</b>";
        die();
    }
}

问题是:每个请求最多使用五个MySQL连接来生成响应。例如:常规请求包括登录验证,获取用户信息,获取帖子信息等。我想知道我是否可以将DataBase实例从API外观传递给子类。我试过像:

public static function getDatabase(){
    $api = self::getInstance();
    return $api->database;
}

但每次我从子类中调用API::getDatabase()时,都会收到MySQL TOO MANY CONNECTIONS 错误,因为此方法调用API __construct()并创建一个新{ {1}}实例。

我知道如何回收我的DataBase实例或连接,以避免连接浪费?


更新

如下所示,我使用依赖注入模式将我的DataBase对象从API外观传递给其子代:

DataBase

1 个答案:

答案 0 :(得分:0)

(从“未答复”中取出。)

评论者建议并且OP验证:

使用依赖项注入模式将DataBase对象从API外观传递给其子代:

private function __construct(){
    $this->database = new DataBase();
    $this->post = new Post($this->database);
    $this->user = new User($this->database);
}

(实际上private已被建议但尚未确认。)