【发布时间】:2020-12-29 15:21:39
【问题描述】:
我的项目在 PHP 7.X 上运行良好,升级到 PHP 8 后出现以下问题,我不知道如何解决。
我有以下(简化的)情况:
<?php
class Vehicle
{
//...
}
class Car extends Vehicle
{
//...
}
class VehicleOutputMaker
{
public function output(Vehicle $entity)
{
}
}
class CarOutputMaker extends VehicleOutputMaker
{
//THROWS EXCEPTION
public function output(Car $entity)
{
parent::output($entity);
}
}
我的整个项目都是这样运行的,但是从 PHP 8 开始,我得到了一条异常
public function output(Car $entity)
带有“致命错误:*** 的声明必须与 *** 兼容”
它与 PHP 7 完美配合!因为“汽车”也是车辆。
有人知道如何解决这个问题吗?
谢谢!
【问题讨论】:
-
它不能与 PHP 7 完美配合,唯一的区别是你得到了
Warning而不是Fatal error。阅读继承的工作原理inheritance。 -
是的,谢谢,这确实是 PHP 7 中的一个警告,现在它是一个致命错误。但我不明白他们为什么现在这么严格。
Car是Vehicle和当我将类型提示从Car更改为Vehicle时,它可以工作,是的。但是我仍然可以将Car对象传递给该方法,尽管类型是Vehicle并且设置了declare(strict_types = 1)。我希望将Car对象传递给需要Vehicle的方法时会出现致命错误,但是......它可以工作。而且我上面的声明说的是一样的,但不会被 PHP 8 接受... -
“但我仍然可以将 Car 对象传递给方法,尽管类型是 Vehicle”......是的,很明显,因为 Car 是 Vehicle 的一种类型。这就是继承的全部意义。
-
但基本上问题是使用与父类中不同的签名覆盖方法是不合逻辑的。在其他强类型 OO 语言中你也无法做到这一点。