php 7.0+ 方法返回类型声明必须用冒号 : 加类型名写在参数列表后,支持基础类型(int/string/bool/float)、类名、接口名、?type、array、void 等,strict_types=1 开启后禁用隐式转换,继承需协变兼容,否则报 typeerror。

PHP 7.0+ 方法返回类型声明怎么写
必须用冒号 : 加类型名写在参数列表后面,不能放在注释里,也不能省略括号后的空格。PHP 不会自动推断,不声明就是 void 或 mixed(取决于版本和严格模式)。
-
function getName(): string { return $this->name; }—— 最简写法,返回值必须是字符串 -
function findUser(int $id): ?User { ... }——?表示可为空,等价于UnionType中的User|null - 基础类型如
int、string、bool、float全部支持,但注意integer和boolean是无效的,只能用int/bool - 自定义类名(如
User)、接口名(如JsonSerializable)直接写,大小写敏感,且类必须已声明或自动加载可用
strict_types=1 对返回类型的影响
没加 declare(strict_types=1); 在文件顶部时,PHP 会尝试强制转换返回值:比如声明 : int 却返回 "123",不会报错,而是静默转成 123;开了 strict 模式后,类型不匹配直接抛 TypeError。
- strict 模式只作用于当前文件,不影响 require 进来的其他文件
- 数组类型声明必须用
array(PHP 7.x)或array|ArrayObject等联合类型,不能写Array -
void表示无返回值,函数体内不能有return $value;,只能return;或无 return;否则报错 - 如果方法有默认返回(比如末尾没 return),strict 模式下可能触发未定义行为,尤其配合早期 PHP 版本时
返回类型和继承/重写时的坑
子类重写父类方法时,返回类型必须兼容(covariant):可以更具体,不能更宽泛。PHP 7.4+ 支持协变返回类型,但 7.3 及之前不支持。
- 父类声明
: Animal,子类可写: Dog(前提是Dog extends Animal),但不能写: object或: mixed - 如果父类没声明返回类型,子类加了声明(如
: string),PHP 会允许,但属于隐式契约破坏,静态分析工具(如 PHPStan)会警告 - 接口中声明
: Collection,实现类返回ArrayObject可以,但返回array就不行——除非接口本身用的是array - trait 中的方法如果带返回类型,被 use 进类后,该类继承链中的重写仍需遵守协变规则
常见报错和调试建议
看到 TypeError: Return value must be of type string, int returned 这类错误,基本就是类型声明和实际返回对不上,但别急着删声明,先查清楚哪一行返回了意外类型。
立即学习“PHP免费学习笔记(深入)”;
- 检查是否漏了
return(尤其 if/else 分支不全时,可能走到函数末尾隐式返回null) - 留意魔术方法如
__toString()必须返回string,否则运行时报错,且无法被 try/catch 捕获(因为是隐式调用) - 使用
var_dump(gettype($value))比get_class()更可靠,尤其对 null、false、0 这些容易混淆的值 - IDE(如 PhpStorm)和 PHPStan 能提前发现多数返回类型冲突,比等运行时报错再修更省时间











