5

我刚刚安装了 PHP 8 并且出现了这个错误?我如何解决它?

致命错误:OM\Db::query(string $statement) 的声明必须与 /home/www/includes 中的 PDO::query(string $query, ?int $fetchMode = null, mixed ...$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;
}
4

3 回答 3

8

#1 - 从作曲家 Json 中删除类似的行

“教义/dbal”:“^2.10”,

#2 - 运行

作曲家升级

#3 - 运行

作曲家更新

#4 - 瞧!错误应该被修复!

于 2021-03-04T23:21:46.067 回答
4

得到了同样的错误,对我来说它有助于替换

公共函数查询(字符串 $statement)

公共函数runQuery(字符串$语​​句)

我在这里得到了提示的解决方案:

由于 PHP 8.0 对 LSP 的签名检查,DatabaseConnection::query 方法被重命名为 DatabaseConnection::runQuery。所有数据库驱动程序现在都需要重命名为此方法以兼容 PHP 8.0。

于 2021-07-06T19:53:08.353 回答
3

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

你有这个:

public function query(string $statement)

,父类有这个:

public function query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs)

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

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

public function query(string $query, ?int $fetchMode = null, ...$fetchModeArgs)

你应该很高兴。

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

于 2020-11-07T11:52:50.383 回答