在对 PHP 7.2 的新功能介绍的一篇文章中,提到了当时 7.2 版本对参数和返回类型的改进,并且还引出了 LSP,即 Liskov 替换原则的话题(没看过的小伙伴建议先看看那篇)。不过当时的改进依然有一个小遗憾,即某个方法的参数(或返回)类型在子类复写时,只能将参数设置为可为 null(或限制返回不可为 null),无法做其他的类型覆盖。到了 7.4 版本,当时的小遗憾终于得到解决了
class Foo
{
}
class FooFoo extends Foo
{
}
class Bar
{
public function handle(FooFoo $foo)
{
}
}
class BarBar
{
public function handle(Foo $foo) // 在 PHP 7.4 之前是会报错的
{
}
}
class Baz
{
public function getFoo(): Foo
{
}
}
class BazBaz
{
public function getFoo(): FooFoo // 在 PHP 7.4 之前是会报错的
{
}
}
关于此改进,以及 LSP,其实也有很多可以聊的点,但在介绍 PHP7.2 那篇文章里,以及后来为 LSP 单独写的一篇文章里,其实概念的东西也还说的很清楚,这里就不用再重复了。总之 LSP 还是很值得深究的,就因为其反直觉的规则很难让人从心里上适应,导致容易违反其规则(所以才有『正方形不是长方形』,『鸵鸟不是鸟』这种经典总结)。
写作累,服务器还越来越贵
求分担,祝愿好人一生平安
天使打赏人