PHP:在单例类中使用 MySQL 连接

标签 php mysql pdo

我有一个 PHP 网络服务,它使用单例 API 类来调用我的网络服务方法。我的应用程序中的每个模块都有特定的类:帖子、用户、登录等。我的 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::getPosts() 在 API 类之外。 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 门面传递到 child 类。我试过类似的东西:

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

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

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


更新

按照下面的建议,我使用了依赖注入(inject)模式将我的DataBase 对象从API facade 传递给它的子对象:

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

最佳答案

(将此从“未答复”中删除。)

评论者建议和 OP 验证:

使用依赖注入(inject)模式将 DataBase 对象从 API facade 传递给它的子对象:

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

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

关于PHP:在单例类中使用 MySQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26238001/

相关文章:

PHP : LOAD DATA LOCAL INFILE forbidden

php - UNIQUE 用户名列未更新

php - 如何通过单选按钮创建列表评级帖子?

php - 在php中包含另一个类中的类

mysql - 从 SELECT 创建的临时表中的多行中选择数据

mysql - 根据另一个表中的列值从一个表中删除记录

php - 如何从 php5 中的表中获取生成的键

php - Yii2 Gridview错误

php - 插入不同服务器上的 MySQL 数据库

php - 将 MySQL 中的查询中的相似条目分组到一起