我尝试按照以下方式在结构工厂中创建单个数据库连接:
try {
$provider = function() {
$instance = new PDO("dsn", "username", "password");
return $instance;
};
} catch (PDOException $exception) {
error_log($exception->getMessage());
}
$factory = new StructureFactory($provider);
和StructureFactory如下:
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);
}
}
然后,当我需要创建一个书籍实例,说“书”时,我这样做:
$factory->create("Book");
但是如果我不需要创建一个书籍实例但只想检查该书是否存在,我想在我的“Book”类中调用静态方法,如:
Book::isBookExisting($bookname);
但是在这个静态方法中,如果我在创建“Book”实例时只能拥有它,如何才能拥有单个数据库连接?
或者我应该只使用Singleton进行数据库连接,而不是使用此工厂?
我有点迷失,因为我不确定我是否正确地做到了。请指教。
答案 0 :(得分:0)
您编写try
catch
块的方式几乎没用,当然也没有按预期执行。
try {
$provider = function() {
$instance = new PDO("dsn", "username", "password");
return $instance;
};
} catch (PDOException $exception) {
error_log($exception->getMessage());
}
请注意,$provider = function() { ...
是anonymous function。其中的代码仅在调用函数时运行。换句话说,在您的示例中,try
块内的代码将从不抛出异常。它只会在被调用时抛出异常,例如$provider()
。
$provider = function() {
try {
$instance = new PDO("dsn", "username", "password");
} catch (PDOException $exception) {
error_log($exception->getMessage());
}
return $instance;
};
解决数据库依赖问题的方法太多了,其中很多都是固执己见的。没有一个解决方案。
你可以:
Book::isBookExisting($provider, $bookname);
Book::setProvider($provider); Book::isBookExisting($bookname);
进一步阅读: