使用静态方法调用单数据库连接

时间:2016-03-31 13:47:03

标签: php pdo

我尝试按照以下方式在结构工厂中创建单个数据库连接:

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进行数据库连接,而不是使用此工厂?

我有点迷失,因为我不确定我是否正确地做到了。请指教。

1 个答案:

答案 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;
}; 

数据库连接

解决数据库依赖问题的方法太多了,其中很多都是固执己见的。没有一个解决方案。

你可以:

  • 使用单身人士
  • 使用参数dep。 Book::isBookExisting($provider, $bookname);
  • 使用静态dep。 Book::setProvider($provider); Book::isBookExisting($bookname);
  • ...

进一步阅读: