如果类在一个文件中,看起来严格的错误不会发生,如下所示:
abstract class Food{}
class Meat extends Food{}
abstract class Animal{
function feed(Food $food){ }
}
class Cat extends Animal{
function feed(Meat $meat){
parent::feed($meat);
}
}
但是如果你将类的定义放在不同的文件中,并像这样包含它们:
abstract class Food{}
class Meat extends Food{}
require 'Animal.php';
require 'Cat.php';
抛出严格标准错误信息:
严格标准:应该与
Animal::feed(Food $food)
兼容的声明Cat::feed()
在 c:\path\to\Cat.php 的第...行。
如果所有内容都在一个文件中,那么这也是可以的:
class Dog extends Animal{
function feed($qty = 1){
for($i = 0; $i < $qty; $i++){
$Meat = new Meat();
parent::feed($Meat);
}
}
}
这是否是预期行为?
因为肉类
是一种食品
,所以首先不应该有抱怨,对吧?
因此,解决方案很明确:将所有内容放在一个文件中,严格遵守标准 ;)
非常感谢任何提示。
Meat
是一种Food
,但并不是每种Food
都是Meat
。一个函数可以将Animal
作为参数,并将其喂给Potato
。Potato
是一种Food
,所以这是合法的,对吧?现在,由于Cat
是一种Animal
,因此您可以将其传递给该函数。这也是合法的,对吧?只有现在出现了这种情况,即Cat
被喂了一颗Potato
,而根据其类定义,这是不允许的。我会说,在这种情况下,Cat
未能扩展Animal
,因为它实际上缩小了其功能范围,而不是扩展(添加到)它。 - SiguzaCat
与Animal
不兼容,您正在违反Liskov替换原则。或者通过声明任何Animal
都可以被喂任何Food
,这显然不是事实。但是,有时候OOP可能并不那么有趣。 - Siguza