我有一个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
实例。例如,Post
和User
具有以下内容:
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
答案 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
已被建议但尚未确认。)