You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP7中子类方法可定义返回类型而父类无返回类型的原因

为什么PHP7中子类方法可以定义返回类型而父类没有?

这绝对不是PHP的bug,而是官方有意设计的特性,核心原因和PHP的类型协变规则,以及「未声明返回类型等价于mixed类型」的设定有关,我给你拆解清楚:

首先得明确一个基础规则:在PHP里,如果一个方法没有显式声明返回类型,它的返回类型默认是mixed——意思是这个方法可以返回任何类型的值,不管是数组、字符串、对象还是null都没问题。

然后看子类重写方法的类型规则:PHP允许返回类型协变,简单说就是子类重写的方法,可以把返回类型限定为父类返回类型的「更具体的子集」。比如父类返回mixed,子类可以返回array;父类返回object,子类可以返回Foo类的实例——只要子类的返回类型是父类返回类型的子类型,就合法。

回到你给出的代码:

class Foo { 
    public function fooMethod() { 
        return []; 
    } 
} 
class Bar extends Foo { 
    public function fooMethod(): array { 
        return ['something']; 
    } 
}

父类的fooMethod()没写返回类型,等价于public function fooMethod(): mixed。子类把返回类型改成array,其实是把原本宽泛的返回范围收窄了,完全符合协变要求。而且这也符合里氏替换原则:任何使用父类Foo的地方,换成子类Bar都能正常工作——因为子类返回的数组本来就在父类允许的返回类型范围内,调用者不会遇到意料之外的类型。

反过来想如果是另一种情况:父类声明返回类型是array,子类去掉返回类型(也就是变成mixed),那PHP肯定会报错,因为这违反了协变规则——子类的返回范围比父类宽,调用者原本预期拿到数组,结果可能拿到其他类型,就会出问题。

所以这种行为是完全合理的,是PHP类型系统设计的一部分,不是bug哦。

内容的提问来源于stack exchange,提问作者Craig Sefton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:12:40