闭包没有定义query()方法。

3

我有以下的闭包

$dbhProvider = function (){
    //Create connection.
    $instance = new \mysqli('localhost', USERNAME, PASSWORD, 'BLOG');
    return $instance;
};

我有以下实现:

$mapper = new UserMapper($dbhProvider);
UserMapper__constructor 看起来像这样。
public function __construct($connection){
    $this->connection = $connection;
    $sql = 'SELECT * FROM USERS WHERE ID=' . $this->user->getId();
    $result = $this->connection->query($sql);
}

当我执行时,遇到了以下错误:Call to undefined method Closure::query()。我该如何正确地实现,使得$this->connection实例变量保持mysqli连接?


你使用的是哪个版本的php?Closure::call 需要php版本>=7。 - VolkerK
代码片段并没有展示为什么需要使用Closure:call()。您没有将连接资源分配给$this->connection,而是分配给了一个提供程序/工厂;因此命名不太理想。 - VolkerK
我使用的是php 5.5.9版本。关于你的第一个注释,请查看我的更新。对于第二个注释,我该如何使用这个实现来分配一个连接? - dios231
调用()- >查询() - VolkerK
1个回答

3
public function __construct($provider) {
    // invoke the closure/provider/factory
    // so that it returns the mysqli instance
    // which then gets assigned to $this->connection
    $this->connection = $provider();
    $sql = 'SELECT * FROM USERS WHERE ID=' ....
}

以下版本的正确方式是什么? - dios231
1
这与使用php7或更低版本无关。是否“正确”是另一个问题,更多涉及软件设计,例如在构造函数中执行sql操作并调用$this->user->getId()(这就是为什么我将其替换为...)。将数据库连接提供程序(闭包)传递给构造函数可能是好的设计,也可能不是。该类名为UserMapper,因此我倾向于将其放在“好”的架子上;-) - VolkerK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接