PHP返回值类型声明需在函数括号后用冒号标注小写基础类型(如int、string),配合declare(strict_types=1)启用严格校验;?Type表示可空,void表示无返回值;PHP8+支持联合类型和完整命名空间类名。
PHP 返回值类型声明的核心规范是:在函数参数列表右括号后、函数体前,用冒号加类型名明确标注返回值类型;必须配合 declare(strict_types=1); 才能真正启用运行时类型校验,否则仅作提示用途。
PHP 仅接受标准小写形式作为合法标量类型声明:int、string、bool、float、array、void。写成 integer 或 Boolean 虽不报语法错,但会被解析器统一转为小写,IDE 和错误信息中也只显示小写名,容易引发误解。
function getId(): int { return 42; } ✅ 合法function getName(): String { return 'abc'; } ❌ 非法(String 不是有效类型)function getConfig(): array { return ['host' => 'localhost']; } ✅ 唯一支持的数组声明方式,不能写 [] 或 Array
?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; } ✅ 允许返回对象或 nullfunction log(string $msg): void { error_log($msg); } ✅ 正确使用 voidfunction log(string $msg): void { return 'done'; } ❌ 致命错误:void 函数不得返回值function delete(int $id): void { return $id > 0; } ❌ 错误语义:应返回 bool 表示是否成功,而非掩盖结果启用严格模式后,PHP 对当前文件中定义的所有函数的参数和返回值执行精确类型匹配,不兼容值直接抛 TypeError。但它不会跨文件传播——即使你在 A.php 中启用了 strict,再 require 'B.php'(B.php 未声明 strict),B.php 中定义的函数仍按弱模式运行。
立即学习“PHP免费学习笔记(深入)”;
function foo(): int { return "123"; } → 静默转为整数 123function foo(): int { return "123"; } → 立即抛错:Return value must be of type int, string returned
return,末尾隐式返回 null,也会触发 TypeError;PHP 7.x 则静默转为 0,极易埋下逻辑漏洞PHP 8.0+ 支持用竖线 | 声明联合类型,如 int|string|float;类名需使用完整命名空间(如 DateTime);iterable、callable、object 等复合类型也受支持。相对类类型(self、parent、static)仅限类方法中使用。
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 不被允许作为返回类型声明