我有一个 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
实例。例如,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
门面传递到 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/