当前位置: 首页 > 面试题库 >

为什么覆盖方法参数违反了PHP中的严格标准?

璩无尘
2023-03-14
问题内容

我知道在StackOverflow中有几个类似的问题,为什么覆盖方法参数违反了PHP中的严格标准?例如:

class Foo
{
    public function bar(Array $bar){}
}

class Baz extends Foo
{
    public function bar($bar) {}
}

严格的标准:Baz :: bar()的声明应与Foo :: bar()的声明兼容

您可以使用其他OOP编程语言。为什么在PHP中不好?


问题答案:

在OOP中,SOLID代表 单一职责,开放式,封闭式,Liskov替换,接口隔离和依赖倒置

Liskov替换原理指出,在计算机程序中,如果BarFoo 的子类型,则可以将 Foo 类型的对象替换为 Bar
类型的对象,而无需更改该程序的任何所需属性(正确性,执行的任务等)。 )。

在强类型编程语言中,当覆盖Foo方法时,如果在Bar中更改签名,则实际上是 超载的,
因为原始方法和新方法可用不同的签名。由于PHP是弱类型的,因此无法实现,因为编译器无法知道您实际调用的是哪种方法。(因此,即使签名不同,您也不能拥有两个名称相同的方法)。

因此,为避免违反Liskov替换原理,将发出严格的标准警告,告知程序员由于子类中方法签名的更改而可能导致某些中断。



 类似资料:
  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha

  • 问题内容: 对于在要克隆对象的类中重写克隆方法,我感到困惑。 对象类具有 受保护的对象 方法,并且按照受保护的行为,即 当方法受到保护时,只能由类本身,该类的子类或与该类位于同一包中的类访问 。 由于Java中的每个类都从Object扩展而来,因此它应该具有clone方法,但仍然被迫重写clone。为什么需要它? 另外,我在某些地方已经阅读了有关覆盖克隆对象并将其公开的信息。我不知道为什么会这样吗

  • 偏离变量只是包含以下字段的对象的一个实例: 附言时间对象是来自 Joda-Time 库的 DateTime 实例,TransportType 是包含常量火车、海船、驳船和卡车的枚举。 编辑: 好的,所以我将比较器编辑为以下内容: 但这显然违反了一般契约。我如何让它按时间排序,然后根据它们的其他属性对那些具有相等时间的对象进行排序,只关心它们是否相等?希望这有意义… 编辑:解决方案 谢谢大家回答我的

  • 问题内容: 我不知道为什么此代码在PHP中不起作用? 看来它没有违反任何OOP规则,但是为什么它给我一个错误? 问题答案: 它 确实 违反了SOLID规则。您声明接受一个类型的参数,但子级接受一个类型的参数。即使是的子类型,它仍然是不同的类型。 当上课的时候,上课也是正确的。但是接受一个,但是不接受一个。因此,据推测,但不接受type参数。这打破了Liskov替代原则。您不能在子接口,周期中更改参

  • 问题内容: 当静态方法在子类中被重写时,我对它的行为感到困惑。 下面是代码: 为什么在第二种情况下在这里调用超类的静态方法? 如果方法不是静态的,则根据多态性,当在运行时传递子类对象时,将调用子类的方法。 问题答案: 静态方法的解析始终基于类型。 代码 编译后转换为此 对此,它是对方法的调用而不是对子类方法的调用。因此,您将获得方法的输出。

  • 问题内容: 当我用方法覆盖方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法? 问题答案: 子类始终可以扩大访问修饰符,因为它仍然是超类的有效替代。从Java规范中有关覆盖和隐藏的需求: 覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与覆盖或隐藏方法相同的访问权限,如下所示: 如果覆盖或隐藏方法是公共的,则覆盖或隐藏方法必须是公共的;否则,将发