我刚刚安装了 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)
为了稍微扩展一下错误消息,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