Php 在抽象类中检查接口实现是否是反模式的?

Php 在抽象类中检查接口实现是否是反模式的?,php,oop,Php,Oop,以下代码是否违反了OOP原则/模式 我特别感兴趣的是Vehicle::whatCanDo()方法中的instanceof检查,该方法检查子类是否实现了特定接口 乍一看,这似乎违反了利斯科夫原则,但事实并非如此,因为飞机和汽车的等级仍然可以互换 抽象类车辆{ 公共函数whatCanDo(){ if($this instanceof CanFly){ 回声“能飞”; } } } 接口能飞{ } 一类飞机扩展了运载工具的可飞性{ } 二等车{ } 如果您指的是实体,则它违反了打开/关闭原则。如果你需要

以下代码是否违反了OOP原则/模式

我特别感兴趣的是Vehicle::whatCanDo()方法中的instanceof检查,该方法检查子类是否实现了特定接口

乍一看,这似乎违反了利斯科夫原则,但事实并非如此,因为飞机和汽车的等级仍然可以互换

抽象类车辆{
公共函数whatCanDo(){
if($this instanceof CanFly){
回声“能飞”;
}
}
}
接口能飞{
}
一类飞机扩展了运载工具的可飞性{
}
二等车{
}

如果您指的是实体,则它违反了打开/关闭原则。如果你需要添加一个新的子类,你将不得不改变超类,实际上间接地导致所有其他子类的改变

同样奇怪的是,一个实例正在测试它是什么类型。这与“工厂方法”在同一雷区内交叉,可被认为构成违反单一责任原则


一般来说,这只是一个糟糕的代码,因为您有一个超类,它会写入输出缓冲区(使用
echo

我们可以假设回声就是,例如,我suppose@RobbieAverill很难说。我见过太多人在他们的
类中有回声。基本上,StackOverflow上的每三个PDO包装器(实际上需要一个单独的rant)都会这样做。@tereško the echo它只是一个例子,而且类名是示例,我的实际代码不同。我不明白为什么它违反了开放/关闭原则。如果我添加了一个新的子类,它可以实现CanFly或not,但Vehicle或Planet类都不应该改变。例如,我可以实现一个新类,比如Ship,它实现了一个新接口CanSwim。我唯一需要修改的是Vehicle::whatCanDo(),以检查当前车辆是否可以游泳,并打印“可以游泳”。飞机和汽车是如此“开放扩展,但关闭修改”。在不修改它们的代码的情况下,我可以添加新的类,它们都继承自同一个超类,但行为稍有不同。@g4b0那么您需要更多地了解打开/关闭原则的实际含义,因为您的“我唯一需要更改的是另一个类”,这是一个违反的教科书示例。