OM\Db::query(string $statement) 的声明必须与 PDO::query 兼容

Har*_*rry 9 php php-8

我刚刚安装了 PHP 8,却出现此错误?我如何解决它?

致命错误: OM\Db::query(string $statement) 的声明必须与 /home/www/includes 中的 PDO::query(string $query, ?int $fetchMode = null, mix ...$fetchModeArgs) 兼容/OM/Db.php 第 131 行

我的 OM/Db.php

public function query(string $statement) =====> line 131
{
  $statement = $this->autoPrefixTables($statement);

  $args = func_get_args();

  if (count($args) > 1) {
    $DbStatement = call_user_func_array(array($this, 'parent::query'), $args);
  } else {
    $DbStatement = parent::query($statement);
  }

  if ($DbStatement !== false) {
    $DbStatement->setQueryCall('query');
    $DbStatement->setPDO($this);
  }

  return $DbStatement;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*che 14

  1. "doctrine/dbal": "^2.10"从......中去除composer.json

  2. 然后(最后)运行composer update


iai*_*inn 7

为了稍微扩展一下错误消息,query类中函数的签名必须与 PDO 类中的父方法兼容。

哪里有这个:

public function query(string $statement)
Run Code Online (Sandbox Code Playgroud)

,父类有这样的:

public function query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs)
Run Code Online (Sandbox Code Playgroud)

为了使子类兼容,PHP 要求在重写方法时在函数签名中定义所有参数(包括可选参数)*

值得庆幸的是,您的函数实现已经兼容,因为您始终将所有参数传递给父级。这意味着解决方案既好又简单:只需将类中的第 131 行更改为

public function query(string $query, ?int $fetchMode = null, ...$fetchModeArgs)
Run Code Online (Sandbox Code Playgroud)

你应该可以走了。

* 早期版本的 PHP 对此提出了警告或严格的标准通知,但在 PHP 8 中已更改为致命错误。请参阅https://3v4l.org/uJYG1