【问题标题】:Call to undefined method Closure::query()调用未定义的方法 Closure::query()
【发布时间】:2016-05-29 06:19:28
【问题描述】:

我有以下闭包

$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。
  • 和两个旁注:a)代码 sn-p 没有说明为什么需要 Closure:call() b)您没有将连接资源分配给 $this->connection 而是供应商/工厂;所以命名是......次优。
  • 我使用 php 5.5.9。对于您的第一个注释,请查看我的更新。对于您的第二个问题,我如何使用此实现来评估连接?
  • 标题已编辑。调用()->查询()

标签: php mysql model-view-controller mysqli closures


【解决方案1】:
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=' ....
}

【讨论】:

  • 这是7以下版本的正确方法吗?
  • 不管是使用php7还是以下。它是否“正确”是另一个问题,更多关于软件设计,例如做 sql 的东西并在构造函数中调用 $this->user->getId() (这就是我用 ... 替换它的原因)。将数据库连接提供程序(闭包)传递给构造函数可能是也可能不是好的设计。这门课叫做UserMapper,所以我倾向于把它放在“好”的架子上;-)
猜你喜欢
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 2020-01-04
  • 2018-10-03
  • 1970-01-01
相关资源
最近更新 更多