PHP 8迁移致命错误:声明必须兼容

jm2pwxwz  于 2023-02-07  发布在  PHP
关注(0)|答案(1)|浏览(164)

我们正在从PHP 7.4升级到PHP 8,我们正面临着声明必须兼容的问题,在我们的代码中自定义参数类型时会出现致命错误,我们需要一个正确的解决方案,减少代码更改。

    • 错误**

致命错误:第102行的客户端React视图::getUrlAddData(?客户端React$客户端React=空)声明必须与/var/www/html/系统/tmp/类客户端React视图. php中的概述\基础视图::getUrlAddData(? Storm \模型$模型=空)兼容

    • 抽象类文件:抽象类基本视图. php**
<?php
 namespace Overview;
 use Storm;

 abstract class BaseView {
  
  public static function getUrlAddData(Storm\Model $model = null){
    // ...
    return $urlAddData;
  }
}
    • 子类文件:类_客户端_React_视图. php**
<?php

  class ClientReactieView extends Overview\BaseView {

   public static function getUrlAddData(ClientReactie $clientReactie = null){
     // ...
     return $urlAddData;
   }
 }
    • 自定义参数类型class_client_reactie. php**
class ClientReactie extends Storm\Model {
  // ...
 }

我们的应用程序已经开发和工作良好的PHP 7.4,我们需要解决方案来解决这个致命的错误,较少的代码更改

vc9ivgsu

vc9ivgsu1#

错误是告诉你的代码是不合逻辑的。
BaseView的定义做出了承诺:可以调用getUrlAddData并传递Storm\Modelnull的任何示例。
ClientReactieView的定义说它扩展了BaseView,所以继承了这个承诺,但是它改变了这个承诺:你可以调用getUrlAddData,但是你不能传递任何非ClientReactie的东西.
这是“输入的协方差”,并且一直被非静态方法所禁止-如果$foo instanceof BaseView为真,那么$foo->getUrlAddData(...)将不得不接受BaseView中的定义所允许的所有值。
PHP 8中的新特性是,这也适用于静态方法,因此同样的保证也适用于“后期静态绑定”调用,例如:

abstract class BaseView {
  
  public static function getUrlAddData(Storm\Model $model = null){
    // ...
    return $urlAddData;
  }

  public static function doSomethingElse(Storm\Model $model = null){
    $urlAddData = static::getUrlAddData($model);
    // ...
  }
}

class ClientReactieView extends Overview\BaseView {

   public static function getUrlAddData(ClientReactie $clientReactie = null){
     // ...
     return $urlAddData;
   }
}

ClientReactieView::doSomethingElse(new Storm\Model);
// ERROR! The call goes to BaseView::doSomethingElse, which accepts any Model
// But static::getUrlAddData resolves to ClientReactieView::getUrlAddData
//  and that has an incompatible signature

所以正确的解决办法是履行父类所做的承诺:

class ClientReactieView extends Overview\BaseView {

   public static function getUrlAddData(Storm\Model $model = null){
     if ( ! $model instanceof ClientReactie ) {
        // Figure out what to do with such calls
     }
     // ...
     return $urlAddData;
   }
}

相关问题