一尘不染

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

php

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

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

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

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

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


阅读 218

收藏
2020-05-29

共1个答案

一尘不染

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

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

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

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

2020-05-29