Php 使用静态方法调用单个数据库连接
我尝试按照结构工厂创建单个db连接,如下所示:Php 使用静态方法调用单个数据库连接,php,pdo,Php,Pdo,我尝试按照结构工厂创建单个db连接,如下所示: try { $provider = function() { $instance = new PDO("dsn", "username", "password"); return $instance; }; } catch (PDOException $exception) { error_log($exception->getMessage()); } $factory = new
try {
$provider = function() {
$instance = new PDO("dsn", "username", "password");
return $instance;
};
} catch (PDOException $exception) {
error_log($exception->getMessage());
}
$factory = new StructureFactory($provider);
和结构工厂如下所示:
class StructureFactory {
protected $provider = null;
protected $connection = null;
public function __construct(callable $provider) {
$this->provider = $provider;
}
public function create($class_name) {
if ($this->connection === null) {
$this->connection = call_user_func($this->provider);
}
return new $class_name($this->connection);
}
}
然后,当我需要创建一个book实例时,比如说“book”,我会这样做:
$factory->create("Book");
但如果我还不需要创建book实例,只想检查该book是否存在,我想在我的“book”类上调用一个静态方法,如:
Book::isBookExisting($bookname);
但是,在这个静态方法中,如果我只能在创建“Book”实例时才拥有单个数据库连接,那么如何才能拥有它呢
或者我应该在db连接中使用Singleton而不是使用这个工厂
我有点不知所措,因为我不确定我做得是否正确。请先通知。
您编写try
catch
块的方式基本上是无用的,而且肯定没有按照您的预期进行
try {
$provider = function() {
$instance = new PDO("dsn", "username", "password");
return $instance;
};
} catch (PDOException $exception) {
error_log($exception->getMessage());
}
请记住,$provider=function(){…
是一个。它内部的代码仅在调用函数时运行。换句话说,在您的示例中,try
块中的代码永远不会引发异常。它只会在调用时引发异常,例如,$provider()
重构
数据库连接
解决数据库依赖性问题的方法太多了,很多都是自以为是的,没有一种解决方案
你可以:
- 使用单例
- 使用参数dep.
Book::isBookExisting($provider,$bookname);
- 使用静态dep.
Book::setProvider($provider);Book::isBookExisting($bookname);
$provider = function() {
try {
$instance = new PDO("dsn", "username", "password");
} catch (PDOException $exception) {
error_log($exception->getMessage());
}
return $instance;
};