【问题标题】:Why is PHP 8.1 telling me that the signature of my function is deprecated? [duplicate]为什么 PHP 8.1 告诉我我的函数的签名已被弃用? [复制]
【发布时间】:2022-01-17 20:00:17
【问题描述】:

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

不推荐使用:OM\Db::prepare(string $statement, $driver_options = null) 的返回类型应该与 PDO::prepare(string $query, array $options = []): PDOStatement|false 兼容,或者应该使用 #[\ReturnTypeWillChange] 属性来暂时抑制第 114 行 //OM/Db.php 中的通知

第 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 php-8.1


    【解决方案1】:

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

    在您的情况下,该类扩展了 PDO。您重新定义了方法prepare,但没有为您的方法指定返回值,默认为mixed。由于mixedPDOStatement|false 不同,PHP 会警告您这种不一致。

    解决方案可以是向重新定义的方法添加相同的返回类型声明(由于联合类型,仅从 PHP 8.0 开始有效)或添加临时属性以使警告静音。例如

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2021-11-25
      • 2014-11-06
      • 2021-12-05
      • 1970-01-01
      • 2017-10-07
      相关资源
      最近更新 更多