Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用静态方法调用单个数据库连接_Php_Pdo - Fatal编程技术网

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

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

我尝试按照结构工厂创建单个db连接,如下所示:

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