PHP 7.0+ 通过冒号后加类型声明返回值,如 function foo(): string { return "ok"; };需配合 declare(strict_types=1) 启用严格检查,nullable 用 ?Type(PHP 7.1+),联合类型自 PHP 8.0 起支持 int|string。

PHP 7.0+ 怎么写函数返回值类型声明
PHP 支持在函数定义末尾用冒号加类型名来声明返回值类型,这是强制性的(启用严格模式后)或提示性的(默认弱类型模式)。不写的话,PHP 就当它返回 mixed,IDE 和静态分析工具就难判断。
实操建议:
- 必须写在函数参数列表右括号之后、花括号之前,比如:
function foo(): string { return "ok"; } - 基础类型直接写小写名:
string、int、bool、float、array、void - 类/接口名用完整命名空间(如果用了):
function getObj(): \DateTime { ... } - 联合类型从 PHP 8.0 开始支持,用竖线分隔:
function getId(): int|string { ... } -
void表示无返回值,不能写return $x;,只能return;或不写 return
strict_types=1 对返回值类型检查有什么影响
没有 declare(strict_types=1); 的文件里,PHP 会自动尝试类型转换——比如函数声明返回 int,但实际 return "123"; 也能过。这会让类型声明形同虚设。
常见错误现象:
立即学习“PHP免费学习笔记(深入)”;
- 本地测试没问题,上线后 CI 报错:因为某些文件漏加
declare(strict_types=1); - 调用方拿到字符串却当成整数用,运行时才出 bug,静态检查完全没拦住
实操建议:
- 每个 PHP 文件顶部第一行(除空白和注释外)加上
declare(strict_types=1); - 这个声明只对当前文件生效,不会影响
include或require的其他文件 - 一旦开启,所有参数类型和返回值类型都走严格检查,不兼容的值直接抛
TypeError
nullable 返回类型怎么写(PHP 7.1+)
要表示“可能返回某个类型,也可能返回 null”,不能写 function foo(): string|null 这种联合类型(PHP 7.1 不支持),得用问号前缀语法。
使用场景:
- 数据库查询没找到记录,返回
null;找到了就返回对象 - 配置项可能未设置,函数需要明确表达“有或没有”
实操建议:
- 写成
function findUser(int $id): ?User,注意问号在类型前,不是后 - 不要写成
User|null(PHP 7.1 不认,会报语法错误) - PHP 8.0+ 开始允许
string|null这种写法,但问号形式仍被广泛使用,两者等价 - 如果函数体里有可能不 return,又没声明 nullable,PHP 会报
TypeError(比如声明: string却走到末尾没 return)
返回数组时用 array 还是具体结构类型
写 function getData(): array 是合法的,但几乎没用——它不说明键名、不说明元素类型,IDE 补全失效,静态分析也帮不上忙。
性能 / 兼容性影响:
-
array声明没有任何运行时开销,但对协作和维护是负向成本 - PHP 8.1 引入了
array{key: type}形式,可以精确描述关联数组结构 - 第三方工具如 PHPStan、Psalm 更依赖这种细粒度类型
实操建议:
- 简单索引数组优先用
list或泛型风格(如string[]):function getNames(): string[] { return ["a", "b"]; } - 关联数组用
array{status: string, code: int}(PHP 8.1+)或文档注释@return array{status: string, code: int} - 如果返回对象数组,别写
array,直接写Foo[]或array<foo></foo>(后者仅部分工具识别)
容易被忽略的是:返回类型声明只是契约起点,真正落地靠 strict 模式 + 静态分析 + 团队约定。光写 : array 等于没写。











