为什么 PHP 8.1 告诉我我的函数签名已弃用?

Why is PHP 8.1 telling me that the signature of my function is deprecated?

我安装了 PHP 8.1,但出现有关已弃用功能的错误。您对此有想法并解决它吗?

Deprecated: Return type of OM\Db::prepare(string $statement, $driver_options = null) should either be compatible with PDO::prepare(string $query, array $options = []): PDOStatement|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in //OM/Db.php on line 114

第 114 行

protected ?array $driver_options = null;
protected ?array $options = null;

public function prepare(string $statement, ?array $driver_options = null) //php8
{
  $statement = $this->autoPrefixTables($statement);

  $DbStatement = parent::prepare($statement, \is_array($driver_options) ? $driver_options : []);
  $DbStatement->setQueryCall('prepare');
  $DbStatement->setPDO($this);

  return $DbStatement;
}

PHP 8.1 已将 return 类型声明添加到大多数内部 functions/methods。但是,由于这样的更改会破坏很多现有的继承,因此 return 类型只是暂时指定的。在重新定义的方法签名与父方法签名不匹配的所有情况下都会发出弃用通知 class.

在您的例子中,class 扩展了 PDO。您重新定义了方法 prepare,但没有为方法指定 return 值,默认为 mixed。由于 mixedPDOStatement|false 不同 PHP 警告您这种不一致。

解决方案可以是向重新定义的方法添加相同的 return 类型声明(由于联合类型,仅自 PHP 8.0 起有效)或添加临时属性以消除警告。例如

#[\ReturnTypeWillChange]
public function prepare(string $statement, ?array $driver_options = null) //php8
{
    // ...

即使您的代码支持旧 PHP 版本,也可以添加该属性。如果您的代码仅支持 PHP 8.0+,则只需添加正确的 return 类型声明。