为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
四季花海 2023-04-02 11:13:57
考虑以下代码片段:class Foo{    public function fooMethod()    {        return [];    }}class Bar extends Foo{    public function fooMethod(): array    {        return ['something'];    }}这工作没有任何错误(在 PHP7.4 和 PHP7.3 中测试)。为什么 PHP 不强制子进程的方法签名与父进程相同(即没有返回类型)?PHP 允许这样做是否有正当理由,或者这是一个错误?我的猜测是,通过不在父级中声明它,我们实际上是在说它可以返回“混合”,因此任何返回类型都是有效的,但我很想知道原因。
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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

    }

}


查看完整回答
反对 回复 2023-04-02
  • 1 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信