我们正在从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,我们需要解决方案来解决这个致命的错误,较少的代码更改
1条答案
按热度按时间vc9ivgsu1#
错误是告诉你的代码是不合逻辑的。
BaseView
的定义做出了承诺:可以调用getUrlAddData
并传递Storm\Model
或null
的任何示例。ClientReactieView
的定义说它扩展了BaseView
,所以继承了这个承诺,但是它改变了这个承诺:你可以调用getUrlAddData
,但是你不能传递任何非ClientReactie
的东西.这是“输入的协方差”,并且一直被非静态方法所禁止-如果
$foo instanceof BaseView
为真,那么$foo->getUrlAddData(...)
将不得不接受BaseView
中的定义所允许的所有值。PHP 8中的新特性是,这也适用于静态方法,因此同样的保证也适用于“后期静态绑定”调用,例如:
所以正确的解决办法是履行父类所做的承诺: