【问题标题】:Injecting interfaces into a php class将接口注入到 php 类中
【发布时间】:2014-11-20 10:54:06
【问题描述】:

所以我为汽车定义了以下接口:

interface FuelTank
{
    public function useFuel();
}

interface WaterTank
{
    public function useWater();
}

interface CarInterface extends FuelTank, WaterTank
{
    public function drive($miles);

    public function setFuelTank(FuelTank $tank);

    public function setWaterTank(WaterTank $tank);
}

我试图构建一个实现并遵守CarInterface 的类,但我在注入 FuelTank 和 Watertank 依赖项时遇到了问题。这是我想出的课程:

class Car implements CarInterface
{
    protected $fuelTank;
    protected $waterTank;

    public function drive($miles)
    {
        return $miles;
    }

    public function useWater()
    {

    }

    public function useFuel()
    {

    }

    public function setFuelTank(FuelTank $tank)
    {
        $this->fuelTank = $tank;
    }

    public function setWaterTank(WaterTank $tank)
    {
        $this->waterTank = $tank;
    }
}

现在当我运行以下命令时:

$car = new Car;
$car->setFuelTank(new FuelTank);

我收到这条消息:

致命错误:无法实例化接口 FuelTank

我也无法声明 FuelTank 类,因为我收到了这个错误:

致命错误:无法重新声明类 FuelTank

谁能帮我理解如何正确实现上面的接口以及这里发生了什么?

【问题讨论】:

  • 您不能像类一样实例化接口。这是 $car->setFuelTank(new FuelTank);错了。

标签: php oop interface


【解决方案1】:

您应该将接口 FuelTank 重命名为 FuelTankInterface 并声明一个实现 FuelTankInterface 的类 FuelTank。无法实例化接口。

【讨论】:

  • 如果接口已经定义给我并且无法更改怎么办?反正这个接口可以实现吗?
  • 创建一个实现 FuelTank 的类 FuelTankClass。虽然命名不是很好。为什么命名一个接口 FuelTank 和另一个接口 CarInterface。最好保持一致...
  • 是的,但是鉴于接口将setFuelTank 参数定义为FuelTank 对象,我无法更改类名。
  • 不,setFuelTank 函数接受所有实现FuelTank 接口的对象。类型提示适用于类,但也适用于接口!所以你可以用FuelTankClass作为参数调用setFuelTank。请参阅php.net/manual/en/language.oop5.typehinting.php,然后在 cmets 中的某处查看。
  • 没错。看来$fuelTank = new FuelTankClass; return $fuelTank instanceof FuelTank; 返回真。我同意命名并不漂亮,但我已经获得了接口并告诉我编写一个实现它的类。我不允许修改界面。
猜你喜欢
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2020-01-31
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多