什么是PHP的返回值类型声明规范

作者:袖梨 2026-07-14
PHP返回值类型声明需在函数括号后用冒号标注小写基础类型(如int、string),配合declare(strict_types=1)启用严格校验;?Type表示可空,void表示无返回值;PHP8+支持联合类型和完整命名空间类名。

PHP 返回值类型声明的核心规范是:在函数参数列表右括号后、函数体前,用冒号加类型名明确标注返回值类型;必须配合 declare(strict_types=1); 才能真正启用运行时类型校验,否则仅作提示用途。

基础类型必须用小写短名

PHP 仅接受标准小写形式作为合法标量类型声明:intstringboolfloatarrayvoid。写成 integerBoolean 虽不报语法错,但会被解析器统一转为小写,IDE 和错误信息中也只显示小写名,容易引发误解。

  • function getId(): int { return 42; } ✅ 合法
  • function getName(): String { return 'abc'; } ❌ 非法(String 不是有效类型)
  • function getConfig(): array { return ['host' => 'localhost']; } ✅ 唯一支持的数组声明方式,不能写 []Array

可空类型与 void 的语义不可混淆

?Type 表示“该类型或 null”,是 PHP 7.1+ 引入的语法糖,等价于 Type|null;而 void 是完全不同的概念——它表示函数不返回任何可用值,调用后若尝试接收返回值(如 $res = saveLog('msg');),PHP 会直接抛出 Fatal error。

  • function findUser(int $id): ?User { return $id === 1 ? new User() : null; } ✅ 允许返回对象或 null
  • function log(string $msg): void { error_log($msg); } ✅ 正确使用 void
  • function log(string $msg): void { return 'done'; } ❌ 致命错误:void 函数不得返回值
  • function delete(int $id): void { return $id > 0; } ❌ 错误语义:应返回 bool 表示是否成功,而非掩盖结果

strict_types=1 只对当前文件生效

启用严格模式后,PHP 对当前文件中定义的所有函数的参数和返回值执行精确类型匹配,不兼容值直接抛 TypeError。但它不会跨文件传播——即使你在 A.php 中启用了 strict,再 require 'B.php'(B.php 未声明 strict),B.php 中定义的函数仍按弱模式运行。

立即学习“PHP免费学习笔记(深入)”;

  • 没开 strict:function foo(): int { return "123"; } → 静默转为整数 123
  • 开了 strict:function foo(): int { return "123"; } → 立即抛错:Return value must be of type int, string returned
  • PHP 8+ 特别注意:若某分支遗漏 return,末尾隐式返回 null,也会触发 TypeError;PHP 7.x 则静默转为 0,极易埋下逻辑漏洞

联合类型与自定义类型需版本对齐

PHP 8.0+ 支持用竖线 | 声明联合类型,如 int|string|float;类名需使用完整命名空间(如 DateTime);iterablecallableobject 等复合类型也受支持。相对类类型(selfparentstatic)仅限类方法中使用。

  • function formatId(mixed $id): int|string { return is_numeric($id) ? (int)$id : (string)$id; } ✅ PHP 8.0+
  • function now(): DateTime { return new DateTime(); } ✅ 完整命名空间
  • class User { public function clone(): static { return new static(); } } ✅ static 仅用于返回值
  • function handle(): resource { ... }resource 不被允许作为返回类型声明

相关文章

精彩推荐