Php 继承和重写类型化属性

Php 继承和重写类型化属性,php,inheritance,Php,Inheritance,我正在尝试用PHP中的继承来创建各种各样的东西。例如,以下代码不起作用 class Animal { public Food $food; } class Cat extends Animal { public Fish $food; //so this part doesn't work, eventhough Fish extends from Food } class Dog extends Animal { public Meat $food; //so th

我正在尝试用PHP中的继承来创建各种各样的东西。例如,以下代码不起作用

class Animal {
    public Food $food;
}

class Cat extends Animal {
    public Fish $food; //so this part doesn't work, eventhough Fish extends from Food
}

class Dog extends Animal {
    public Meat $food; //so this part doesn't work, eventhough Meat extends from Food
}

class Food {
    public int $weightInKilograms;
}

class Fish extends Food {
    public bool $isSaltWaterFish;
}
class Meat extends Food {
    public bool $isRawMeat;
}
那么,在上面的代码中添加注释的地方,如何使部件工作呢?我不明白为什么这不应该起作用,因为ChildX也和SuperX一样,如果它扩展了SuperX

我得到以下错误:


致命错误:猫的类型::$食物必须是食物(如 第6行[…]中的[…]类动物)

快速回答 这是不可能的

简短回答 在super class
Animal
中添加一个抽象方法,其中包含
Food
参数

Animal.php

abstract public function setFood(Food $food);
Cat.php

public function setFood(Food $food) {
   if (!$food instanceof Fish) {
      throw new InvalidArgumentException(self::class . " only support " . Fish::class . " objects.");
   }
   $this->food = $food;
}

旁注:这个问题通常与PHP有关,因此您可能希望删除框架标记,因为它没有专门绑定到其中任何一个。