在 PHP7 中,为什么子类的方法可以定义返回类型,而重写的父方法却没有?

考虑以下代码片段:


class Foo

{

    public function fooMethod()

    {

        return [];

    }

}


class Bar extends Foo

{

    public function fooMethod(): array

    {

        return ['something'];

    }

}

这工作没有任何错误(在 PHP7.4 和 PHP7.3 中测试)。为什么 PHP 不强制子进程的方法签名与父进程相同(即没有返回类型)?PHP 允许这样做是否有正当理由,或者这是一个错误?我的猜测是,通过不在父级中声明它,我们实际上是在说它可以返回“混合”,因此任何返回类型都是有效的,但我很想知道原因。


四季花海
浏览 98回答 1
1回答

慕尼黑的夜晚无繁华

PHP手册指出:笔记:覆盖父方法时,子方法必须匹配父方法的任何返回类型声明。如果父方法没有定义返回类型,那么子方法可能会这样做。请注意以下行:“如果父方法未定义返回类型,则子方法可能会这样做”所以如果你看看你的例子;Foo 类中的父方法没有定义返回类型,因此 Bar 类中的子方法可以设置它希望的任何返回类型。A:class Foo{    public function fooMethod()    {        return []; // returns an array. Type expected: any.    }}class Bar extends Foo{    public function fooMethod(): array    {        return ['something']; // returns an array, type expected: array    }}乙:这个很好用,因为没有预先存在的类型期望,所以当子类设置一个类型时,它不会覆盖任何东西。class Foo{    public function fooMethod()    {        return []; // returns an array, type expected any    }}class Bar extends Foo{    public function fooMethod(): string    {        return "horses"; // returns a string, type expected: string    }}C:这会导致问题(即你邪恶的军事月球基地将随着失去所有的手而被摧毁)因为孩子试图覆盖父方法的已经定义的返回类型属性。class Foo{    public function fooMethod(): int    {        return 874; // returns an int, type expected is int.    }}class Bar extends Foo{    public function fooMethod(): array    {        return ['something']; // returns an array, type expected int    }}
打开App,查看更多内容
随时随地看视频慕课网APP