PHP Fatal error提示子类方法返回类型与父类不兼容,因PHP要求子类返回类型必须是父类返回类型的协变子类型(如Animal→Dog),禁止逆变或更宽泛类型(如Animal→mixed),且基础类型不支持协变。

方法返回类型不兼容的典型报错
当你看到类似 PHP Fatal error: Declaration of Child::method() must be compatible with Parent::method(): ReturnType 的错误,说明子类重写父类方法时,返回类型声明与父类不一致。PHP 7.2+ 启用严格类型检查后,这不再是警告而是致命错误。
为什么会出现返回类型不兼容
PHP 要求子类方法的返回类型必须是父类对应方法返回类型的「协变」(covariant)子类型——即更具体、不能更宽泛。例如:
- 父类声明
function get(): Animal,子类可返回Dog(Dog extends Animal)✅ - 但子类若声明
function get(): mixed或function get(): object❌(比Animal更宽) - 父类没声明返回类型,子类却加了
: string❌(属于「逆变」,不允许)
快速修复的三步操作
先确认父类方法签名,再对齐子类声明:
- 用
php --rf ParentClass::method查看父类实际返回类型(含继承链) - 子类方法返回类型必须是父类返回类型的子类,或完全一致;不能是
mixed、object、array等更泛化类型 - 如果父类没声明返回类型,子类也**不要加**——否则会触发不兼容;如需类型安全,应统一在父类补上
: ?SomeType或: SomeType
容易被忽略的陷阱
协变只适用于「对象类型」,基础类型(string、int)和联合类型(string|int)不支持子类型替换:
立即学习“PHP免费学习笔记(深入)”;
-
function getId(): int→ 子类不能写function getId(): positive-int(PHP 8.1+ 仍视为不兼容) -
function getData(): array→ 子类写function getData(): string[]❌(string[]不是array的协变子类型) - 使用
ReturnType时,注意?ReturnType和ReturnType|null在 PHP 8.0+ 是等价的,但前者更推荐
最稳妥的做法:父类先定义好明确、稳定的返回类型,子类严格继承;临时绕过只能删掉子类的返回声明,但这是权宜之计,不是解法。



















